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?
Ответы
Ответ 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(), чтобы перейти в локальный часовой пояс.