在 Pandas 时间序列图中从 Axes.get_xlim() 获取可用日期

2024-05-05

我试图从用 pandas 创建的时间序列图中获取作为 python 日期时间对象的图的 xlimits。使用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

根据pandas 时间序列文档 http://pandas.pydata.org/pandas-docs/stable/timeseries.html,pandas 使用 numpy.datetime64 数据类型。我正在使用 pandas 版本“0.9.0”。

我在用get_xlim()而不是直接访问 pandas 系列,因为我正在使用xlim_changed当用户在绘图区域中移动时回调以执行其他操作。

黑客获取可用值

对于上面的示例,限制返回为hours自纪元以来。所以我可以转换为seconds自纪元以来并使用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)  

目前的行为matplotlib.日期 http://matplotlib.org/api/dates_api.html:

datetime 对象转换为浮点数,表示自 0001-01-01 UTC 以来的天数加 1。例如,0001-01-01, 06:00 是 1.25,而不是 0.25。辅助函数 date2num()、num2date() 和 drange() 用于促进日期时间和数值范围之间的轻松转换。

pandas.tseries.converter.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])

gives:

datetime.datetime(2000, 1, 1, 0, 0, tzinfo=<matplotlib.dates._UTC object at 0x7ff73a60f290>)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Pandas 时间序列图中从 Axes.get_xlim() 获取可用日期 的相关文章

随机推荐