2012-12-12 101 views
1

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

的代码如下:

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) 
... 
+0

我在[github](https: //github.com/pydata/pandas/issues/2503)。 –

+0

非常感谢你的帮助。你的编辑是完美的:) – wuwucat

回答

1

对于规则的频率索引的数据,熊猫标的指数转换为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> 

*时间是保持纳秒

话虽这么说,理想情况下,我们会隐藏转换日期时间的子类(或者根本没有必要做转换!),只要我有足够的时间来重构所有的绘图代码...

+0

非常感谢你,我通过使用matplotlib而不是熊猫来绘制图形来解决问题。然后ginput()正常工作。 – wuwucat

相关问题