Pandas DataFrame指定行范围的datetime索引1小时偏移实现方法
失效原因
原有代码两处写法都无法生效的原因:
- 直接修改布尔索引返回的临时副本的索引,修改不会同步到原DataFrame
- 注释的
shift写法是把筛选后的偏移索引赋值给整个DataFrame的索引,会导致时间范围外的索引变为缺失值,不符合需求
可用实现代码
以下写法不依赖索引的freq属性,即使索引freq为None也可正常运行:
import pandas as pd # 你的原有数据构造逻辑 df = pd.DataFrame() df['datetime'] = pd.date_range(start='2016-01-01', end='2019-01-01', freq='30T') df = df.set_index('datetime') # 定义目标时间范围 date_start = '2016-01-01 00:00:00' date_end = '2016-03-02 23:49:50' # 构造筛选掩码 shift_mask = (df.index >= date_start) & (df.index <= date_end) # 条件替换索引 df.index = df.index.where(~shift_mask, df.index + pd.Timedelta('1H')) # 若偏移后索引顺序混乱,可追加排序操作 # df = df.sort_index()
逻辑说明
- 用
where方法做条件替换:不符合偏移条件的行保留原有索引,符合条件的行替换为加1小时后的索引 - 直接对原索引整体赋值,不存在修改副本不生效的问题
- 仅依赖索引的datetime类型属性,不需要索引设置固定freq
内容的提问来源于stack exchange,提问作者Medulla Oblongata
相关产品推荐
相关产品推荐

