Подтвердить что ты не робот

Matplotlib plot_date время сохранения в UTC даже с пользовательским часовым поясом

Я использую matplotlib для построения данных против временных меток в python 2.6. Я нашел функцию plot_date(), и она отлично работает! Тем не менее, все время в UTC. Я прочитал документы, в которых говорится, что вы можете передать параметр tz функции для установки пользовательского времени. Кажется, это не работает. Даже после прохождения параметра время остается в UTC. Я пробовал несколько методов, но безрезультатно.

Примечания: Я импортирую CSV файл, заполненный эпохой, для генерации оси X. Итак, я перехожу из эпохи в формат matplotlib, используя epoch2num().

Источник образца:

import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import matplotlib.dates as mdates
from pytz import timezone

...

dates = mdates.epoch2num(dates) # Converting my list of dates from epochs
plt.plot_date(dates, data,fmt='-',tz="US/Eastern",xdate=True)

Этот код не создает правильные временные метки вдоль оси. Это графически просто отлично, хотя.

Также попытался:

plt.plot_date(dates,data,fmt='-',tz=timezone('US/Eastern'),xdate=True)

Тот же результат, что и в первом примере. Все остается в UTC.

Для усмешек я запустил num2date() в списке "даты" и распечатал вывод. Выходные значения были в формате UTC. Затем я добавил tz = часовой пояс ('US/Eastern') к вызову num2date(), а выходные значения были в восточном направлении, как и должно быть.

Я также пытался "предварительно преобразовать" даты в Eastern перед вызовом plot_date, а затем опустив ключевое слово tz = в plot_date, но все же значения - это UTC.

Наконец, я редактировал файл matplotlibrc и менял #timezone UTC на #timezone US/Eastern и до сих пор не добился успеха.

Что мне не хватает, чтобы получить эти даты на графике за пределами UTC?

4b9b3361

Ответ 1

Я удалил Matplotlib 1.0.0 и вместо этого установил 0.99.3. После этого я теперь смогу правильно установить часовой пояс и увидеть эффекты. Я протестировал с образцом, предоставленным Unutbu, а затем с моим собственным кодом. Все работает так, как должно.

Возможно, это ошибка в версии 1.0.0?

Ответ 2

Я тоже вижу это поведение в Matplotlib 1.0.1.

Я посмотрел на него в отладчике, и IMHO аргумент tz игнорируется. Ошибка находится в matplotlib.axes.Axes.xaxis_date (файл "axes.py", строка 2679).

Я написал для него отчет об ошибке: https://sourceforge.net/tracker/index.php?func=detail&aid=3176823&group_id=80706&atid=560720

Ответ 3

Чтобы получить даты с меткой EST, вы можете сделать следующее:

import matplotlib.pyplot as plt
import pytz
import numpy as np
import datetime
import time

est=pytz.timezone('US/Eastern')
n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
# You could build timezone-aware datetime objects this way:
dates=[datetime.datetime.fromtimestamp(ts,est) for ts in timestamps]
# or use timezone-naive datetime objects using `utcfromtimestamp` below.
# plt.plot_date interprets naive datetime objects to be in the UTC timezone.
# dates=[datetime.datetime.utcfromtimestamp(ts) for ts in timestamps]    
values=np.cumsum(np.random.random(n) - 0.5)
plt.xticks(rotation=25)
plt.plot_date(dates,values,tz=est,linestyle='dashed')
plt.show()

дает

alt text

Ответ 4

tz устанавливается в UTC по умолчанию в matplotlib rcParams. просто используйте tz from dateutils.tz.tzlocal(), чтобы перейти в локальный часовой пояс.