我有一个数据帧,使用以下代码生成:
time_index = pd.date_range(start=datetime(2013, 1, 1, 3),
end=datetime(2013, 1, 2, 2, 59),
freq='5T')
grid_columns = [u'in_brd', u'in_alt', u'out_brd', u'out_alt']
grid_proto = pd.DataFrame(index=time_index, columns=grid_columns)
我还在此数据框中添加了一些数据。
当我尝试在基本数据框中使用int
偏移量浏览索引时,我得到了正确的结果:
In[152]: grid_proto.index[0] + 1
Out[152]: Timestamp('2013-01-01 03:05:00', tz=None)
但如果我尝试使用某种切片,我会收到错误:
In[153]: z = grid_proto[pd.notnull(x.in_brd)]
In[154]: z.index[0] + 1
Traceback (most recent call last):
File "<ipython-input-151-3ce8a4e5e2d6>", line 1, in <module>
z.index[0] + 1
File "tslib.pyx", line 664, in pandas.tslib._Timestamp.__add__ (pandas\tslib.c:12372)
ValueError: Cannot add integral value to Timestamp without offset.
我理解这是因为在第一种情况下,我使用了DatetimeIndex
元素的链接而不是标量。在第二种情况下,我得到第一个索引元素的标量Timestamp
值。我是对的吗?
如何正确处理此偏移? (我需要浏览这样的切片)
答案 0 :(得分:4)
原因是在第一种情况下,您有一个频率为5分钟的常规DatetimeIndex。因此,整数1将被解释为频率的一个单位(5分钟)
在第二种情况下,由于切片,您不再有常规时间序列,并且DatetimeIndex不再具有频率(z.index.freq
将给出无,而grid_proto.index.freq
将给出5分钟)。
要解决此问题,您可以明确地添加5分钟:
In [22]: import datetime as dt
In [23]: z.index[0] + dt.timedelta(minutes=5)
Out[23]: Timestamp('2013-01-01 03:05:00', tz=None)
或者您可以添加pd.DateOffset(minutes=5)
(这会产生相同的结果)。