微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

时间轴操作错误的结果

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 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

解决方法:

Numpy在1.6.2 / 1中的timedelta上有很多错误.它适用于间隔< 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'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐