Pandas timedelta重新采样周失败

3

实际问题

就像这个小例子所示,我试图对一个pandas数据帧进行每周重新采样:

import datetime
import pandas as pd

df = pd.DataFrame([{
    'A' : datetime.datetime.now() - datetime.datetime.now(),
    'B' : 2
},{
    'A' : datetime.datetime.now() - datetime.datetime.now(),
    'B' : 3
}])

df = df.set_index('A')

df.resample('W', how="mean")

这会抛出一个 AttributeError 异常:

AttributeError: 'Week' object has no attribute 'nanos'

(注意:如果我使用“D”重新采样,则不会出现问题)
如果我将索引转换为日期时间:
df.index = pd.to_datetime(df.index.values)
df.resample('W', how="mean")

重新采样也可以工作。

问题:是否有一种不依赖于纳秒的Pandas时间差类型?

或者:您是否有比利用datetime进行timedelta更优雅的方式?


完整跟踪:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/pandas/core/generic.py", line 3266, in resample
    return sampler.resample(self).__finalize__(self)
  File "/Library/Python/2.7/site-packages/pandas/tseries/resample.py", line 98, in resample
    rs = self._resample_timestamps(kind='timedelta')
  File "/Library/Python/2.7/site-packages/pandas/tseries/resample.py", line 272, in _resample_timestamps
    self._get_binner_for_resample(kind=kind)
  File "/Library/Python/2.7/site-packages/pandas/tseries/resample.py", line 122, in _get_binner_for_resample
    self.binner, bins, binlabels = self._get_time_delta_bins(ax)
  File "/Library/Python/2.7/site-packages/pandas/tseries/resample.py", line 236, in _get_time_delta_bins
    name=ax.name)
  File "/Library/Python/2.7/site-packages/pandas/tseries/tdi.py", line 167, in __new__
    closed=closed)
  File "/Library/Python/2.7/site-packages/pandas/tseries/tdi.py", line 235, in _generate
    index = _generate_regular_range(start, end, periods, offset)
  File "/Library/Python/2.7/site-packages/pandas/tseries/tdi.py", line 895, in _generate_regular_range
    stride = offset.nanos
AttributeError: 'Week' object has no attribute 'nanos'

版本

>>> pd.__version__
'0.16.2'
>>> np.__version__
'1.10.1'
1个回答

0

我认为区别在于pandas使用了numpy的datetime64,而Python的datetime类是另一种不同的东西。当你调用时

df.index = pd.to_datetime(df.index.values)

你正在将你创建的 datetime.datetime 对象转换为 resample 所使用的 numpy.datetime64 对象。


当然,但这怎么回答我的问题呢? - Milla Well
你的问题是:问题:是否有不依赖于纳秒的pandas时间差类型?我的回答是:是的,numpy.datetime64。你还问:或者,您是否有比利用datetime更优雅的timedelta方法?我的答案是:没有,因为numpy.datetime64中没有datetime.datetime.now()的等效函数。请参考http://docs.scipy.org/doc/numpy/reference/arrays.datetime.html。 - kingledion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接