dta_h 是一个DataFrame,而 dta_h.Datetime 是这样的:
0 2013-03-01 00:00:00
1 2013-02-28 23:00:00
2 2013-02-28 22:00:00
3 2013-02-28 21:00:00
...
Name: Datetime, Length: 63001, dtype: datetime64[ns]
直到最近(我稍后会解释这意味着什么)我可以这样做以减去每个时间段的一小时:
dta_h.Datetime-np.timedelta(hours=1)
但是现在,如果我这样做,我得到了这个:
0 2013-03-01 00:11:34.967296
1 2013-02-28 23:11:34.967296
2 2013-02-28 22:11:34.967296
3 2013-02-28 21:11:34.967296
...
这显然不是我想要的。但是,这个:
[i-timedelta(hours=1) for i in dta_h.Datetime ]
仍然会产生污点:
0 2013-02-28 23:00:00
1 2013-02-28 22:00:00
2 2013-02-28 21:00:00
3 2013-02-28 20:00:00
....
Length: 63001, dtype: datetime64[ns]
当我升级到Pandas 0.11时,我99%确定此问题已经开始。我一直在查看文档中的任何差异,可能会解释它没有成功。我也发现了这个帖子:
pandas handling of numpy timedelta64[ms]
指的是这个熊猫问题
https://github.com/pydata/pandas/issues/3009
根据我在那里读到的内容,我尝试了:
dta_h.Datetime-np.timedelta64(hours=1)
但这实际上什么也没做:
0 2013-03-01 00:00:00
1 2013-02-28 23:00:00
2 2013-02-28 22:00:00
3 2013-02-28 21:00:00
...
任何想法为什么1)df-np.timedelta停止工作,2)为什么理解列表版本仍然有效?谢谢你的帮助。
仅供参考,我使用的是Numpy 1.6.2,我之前说过,最近从Pandas 0.9升级到0.11
答案 0 :(得分:2)
对于timedeltas来说,Numpy在1.6.2 / 1中非常错误。它适用于间隔< 30分钟(我不明白为什么)。最好的办法是升级到numpy 1.7.0 / 1更稳定,并使用datetime.timedelta
In [33]: df = DataFrame(dict(date = [Timestamp('20130301'),Timestamp('20130228 23:00:00'),Timestamp('20130228 22:00:00'),Timestamp('20130228 21:00:00')]))
In [34]: df
Out[34]:
date
0 2013-03-01 00:00:00
1 2013-02-28 23:00:00
2 2013-02-28 22:00:00
3 2013-02-28 21:00:00
In [37]: df['date'] + timedelta(hours=1)
Out[37]:
0 2013-03-01 01:00:00
1 2013-03-01 00:00:00
2 2013-02-28 23:00:00
3 2013-02-28 22:00:00
Name: date, dtype: datetime64[ns]
In [38]: np.__version__
Out[38]: '1.7.1'
答案 1 :(得分:1)
您可以使用以纳秒为单位的时间:
In [11]: df - pd.np.timedelta64(60*60*10**9) # one hour in nanoseconds
Out[11]:
date
index
0 2013-02-28 23:00:00
1 2013-02-28 22:00:00
2 2013-02-28 21:00:00
3 2013-02-28 20:00:00
timedelta64似乎忽略了关键字参数:
In [12]: df - pd.np.timedelta64(foo=60*60*10**9)
Out[12]:
date
index
0 2013-03-01 00:00:00
1 2013-02-28 23:00:00
2 2013-02-28 22:00:00
3 2013-02-28 21:00:00
感觉你应该能够使用熊猫补偿:
df.date - pd.offsets.Hour(1)
ValueError: cannot operate on a series with out a rhs of a series/ndarray of type datetime64[ns] or a timedelta
目前,您可以使用apply或delta属性执行此操作:
In [21]: df.date.apply(lambda t: t - pd.offsets.Hour(1))
Out[21]:
index
0 2013-02-28 23:00:00
1 2013-02-28 22:00:00
2 2013-02-28 21:00:00
3 2013-02-28 20:00:00
Name: date, dtype: datetime64[ns]
In [22]: df.date - pd.offsets.Hour(1).delta
Out[22]:
index
0 2013-02-28 23:00:00
1 2013-02-28 22:00:00
2 2013-02-28 21:00:00
3 2013-02-28 20:00:00
Name: date, dtype: datetime64[ns]