Matplotlib plot_date хранит время в UTC даже с пользовательским часовым поясом - PullRequest
13 голосов
/ 20 декабря 2010

Я использую matplotlib для отображения данных по временным меткам в python 2.6. Я нашел функцию plot_date (), и она прекрасно работает! Тем не менее, время все в UTC. Я прочитал документы, в которых говорится, что вы можете передать параметр tz в функцию, чтобы установить пользовательский timezome. Это не похоже на работу. Даже после передачи параметра время остается в 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 = timezone ('US / Eastern') к вызову num2date (), и значения выводились в восточном, как и должно быть.

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

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

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

Ответы [ 4 ]

5 голосов
/ 10 февраля 2011

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

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

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

4 голосов
/ 20 декабря 2010

Чтобы получить даты, помеченные 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

3 голосов
/ 20 декабря 2010

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

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

0 голосов
/ 06 апреля 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...