Получение полезных дат из топоров.получить xlim () в графике временного ряда панды
Я пытаюсь получить xlimits графика в виде объекта Python datetime из графика временного ряда, созданного с помощью pandas. Использование ax.get_xlim() возвращает пределы оси в виде numpy.float64, и я не могу понять, как преобразовать числа в пригодное для использования время.
import pandas
from matplotlib import dates
import matplotlib.pyplot as plt
from datetime import datetime
from numpy.random import randn
ts = pandas.Series(randn(10000), index=pandas.date_range('1/1/2000',
periods=10000, freq='H'))
ts.plot()
ax = plt.gca()
ax.set_xlim(datetime(2000,1,1))
d1, d2 = ax.get_xlim()
print "%s(%s) to %s(%s)" % (d1, type(d1), d2, type(d2))
print "Using matplotlib: %s" % dates.num2date(d1)
print "Using datetime: %s" % datetime.fromtimestamp(d1)
Который возвращает:
262968.0 (<type 'numpy.float64'>) to 272967.0 (<type 'numpy.float64'>)
Using matplotlib: 0720-12-25 00:00:00+00:00
Using datetime: 1970-01-03 19:02:48
По панды таймсерии документы, панды использует библиотеки numpy.datetime64 dtype. Я использую версию pandas '0.9.0'.
Я использую get_xlim() вместо прямого доступа к серии панд потому что я использую обратный вызов xlim_changed, чтобы делать другие вещи, когда пользователь перемещается в области графика.
Взломать, чтобы получить полезные значения
Для приведенного выше примера ограничения возвращаются через часов С момента начала эпохи. Таким образом, я могу преобразовать в секунды с эпохи и использовать time.gmtime(), чтобы получить что-то полезное, но это все еще не кажется правильным.
In [66]: d1, d2 = ax.get_xlim()
In [67]: time.gmtime(d1*60*60)
Out[67]: time.struct_time(tm_year=2000, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=1, tm_isdst=0)
2 ответов:
# First convert to pandas Period period = pandas.tseries.period.Period(ordinal=int(d1), freq=ax.freq) # Then convert to pandas timestamp ts = period.to_timestamp() # Then convert to date object dt = ts.to_datetime()
Текущее поведение matplotlib.даты :
Объекты Datetime преобразуются в числа с плавающей запятой, которые представляют время в днях с 0001-01-01 UTC, плюс 1. Например, 0001-01-01, 06: 00-это 1.25, а не 0.25. Вспомогательные функции date2num (), num2date() и drange () используются для облегчения простого преобразования в и из datetime и числовых диапазонов.Панды.церис.конвертер.PandasAutoDateFormatter (), похоже, строится на этом, Итак:
x = pandas.date_range(start='01/01/2000', end='01/02/2000') plt.plot(x, x) matplotlib.dates.num2date(plt.gca().get_xlim()[0])Дает:
datetime.datetime(2000, 1, 1, 0, 0, tzinfo=<matplotlib.dates._UTC object at 0x7ff73a60f290>)
Comments