3

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]

我 99% 确定这个问题是在我升级到 Pandas 0.11 时开始的。我一直在文档中寻找可能无法成功解释的版本中的任何差异。我还发现了这个帖子:

pandas 处理 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

4

2 回答 2

2

Numpy 在 1.6.2/1 中对于 timedeltas 非常有问题。它适用于<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'
于 2013-07-05T15:46:37.117 回答
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]
于 2013-07-05T15:23:53.407 回答