DatetimeIndex 偏移问题

1 投票
1 回答
6004 浏览
提问于 2025-04-18 04:34

我有一个数据框,是用以下代码生成的:

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 值。我理解得对吗?

我该如何正确处理这个偏移量?(我需要在这样的切片中导航)

1 个回答

4

原因是,在第一种情况下,你有一个常规的时间索引,它的频率是5分钟。所以数字1会被理解为一个单位的频率(5分钟)。
而在第二种情况下,由于进行了切片操作,你就没有一个规则的时间序列了,时间索引也就没有频率了(z.index.freq会返回None,而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)(这样也会得到相同的结果)。

撰写回答