在 pandas 中,向数据帧的子集添加时间偏移量不起作用

In pandas adding a time offset to a subset of the dataframe has no effect

提问人:NeStack 提问时间:8/8/2023 更新时间:8/8/2023 访问量:35

问:

我注意到 pandas 包的一个奇怪行为,这在某些情况下会导致意外无法添加时间偏移量。

假设我有以下数据帧:

df = pd.DataFrame({'time': ['2022-01-24', '2022-02-24', '2022-03-24'], 
                   'value': [10, 20, 30]})

我可以使用以下语法成功为其添加时间偏移量:

df.set_index(['time'], inplace=True)
df.index = pd.to_datetime(df.index, format='%Y-%m-%d')
df.index = df.index + pd.offsets.DateOffset(years=100)

但是有一个失败,当我想只将偏移量添加到数据帧的子集时,例如只添加到之后的日期,见下文:2022-02-25

df.set_index(['time'], inplace=True)
df.index = pd.to_datetime(df.index, format='%Y-%m-%d')
df[df.index>pd.to_datetime('2022-02-25')].index = df[df.index>pd.to_datetime('2022-02-25')].index + pd.offsets.DateOffset(years=100)

第二个代码滑移导致 的列没有变化。为什么当我只对切片执行添加时没有任何变化?我如何成功地做到这一点?TNX系列timedf

Python 熊猫 日期时间 切片

评论


答:

2赞 Andrej Kesely 8/8/2023 #1

您可以尝试使用新值设置整个索引(如果索引已排序,而不仅仅是其中的一部分):

mask = df.index > pd.to_datetime("2022-02-25")

df.index = (
    *df[~mask].index,
    *(df[mask].index + pd.offsets.DateOffset(years=100)),
)

print(df)

指纹:

            value
2022-01-24     10
2022-02-24     20
2122-03-24     30

评论

0赞 NeStack 8/8/2023
谢谢,这成功了!但是你能在你的回答中解释为什么我的代码片段不起作用吗?你做了什么不同的事情来让它发挥作用?
0赞 Andrej Kesely 8/8/2023
@NeStack我猜您只设置了原始索引值的副本,因此新值不会传播到整个数据帧。