【问题标题】:Ginput giving wrong date for datetimeindexGinput 为 datetimeindex 提供错误的日期
【发布时间】:2012-11-29 18:06:32
【问题描述】:

我读入一个文件并用 pandas DataFrame 绘制它。索引是DatetimeIndex,然后我使用ginput(1)方法得到一个点,但是我得到的坐标是错误的。

代码如下:

import pandas as pd
from matplotlib.dates import num2date, date2num
ts = pd.date_range('2012-04-12,16:13:09', '2012-04-14,00:13:09', freq='H')
df = pd.DataFrame(index=ts)
df[0] = 20.6

然后我使用ginput 绘制并单击图表:

df.plot()
t = pylab.ginput(n=1) #click somewhere near 13-APR-2012

但是,第一项似乎是一个浮点数

In [8]: x = t[0][0] # ~ 370631.67741935479

In [9]: num2date(x)
Out[9]: datetime.datetime(1015, 10, 3, 16, 15, 29, 32253, tzinfo=<matplotlib.dates._UTC object at 0x104196550>)
# this is way out!

文档建议它应该使用这些浮点数(来自datetonum):

In [10]: dt = pd.to_datetime('13-4-2012', dayfirst=True)

In [11]: date2num(dt)
Out[11]: 734606.0

这个浮点数是什么,如何将其转换为日期时间?

注意:如果我从数据框中删除其中一行,这将正常工作:

df1 = df.drop(ts[1], axis=0)
...

【问题讨论】:

  • 我将此作为问题添加到github
  • 非常感谢您的帮助。您的编辑非常完美:)

标签: python matplotlib pandas


【解决方案1】:

对于以固定频率索引的数据,pandas 将底层索引转换为 PeriodIndex,以便在放大和缩小时自动更新 x-tick 标签的分辨率。所以你得到的序数是句号。

为了将其转换回日期时间,您可以执行以下操作:

In [36]: pd.Period(ordinal=int(t[0][0]), freq='H')
Out[36]: Period('2012-04-12 18:00', 'H')

In [37]: pd.Period(ordinal=int(t[0][0]), freq='H').to_timestamp()
Out[37]: <Timestamp: 2012-04-12 18:00:00>

*Timestamp 是 datetime 的子类,以纳秒为单位

话虽如此,理想情况下,只要我有足够的时间重构所有绘图代码,我们就会对用户隐藏转换(或者根本不必进行转换!)...

【讨论】:

  • 非常感谢,我通过使用matplotlib而不是pandas绘制图形解决了这个问题。然后ginput()正常工作。
猜你喜欢
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 2016-11-23
  • 2019-03-22
  • 1970-01-01
  • 2011-04-18
相关资源
最近更新 更多