如何为DataFrame的子集添加timedelta时间增量
给DataFrame指定时间区间的Datetime添加1小时Timedelta的解决方案
先构造示例数据
基于你提供的时间列表创建两种场景的DataFrame:
import pandas as pd dt_list = [ "2022-06-01 00:30:00", "2022-06-01 01:00:00", "2022-06-01 01:30:00", "2022-06-01 02:00:00", "2022-06-01 02:30:00", "2022-06-01 03:00:00", "2022-06-01 03:30:00", "2022-06-01 04:00:00", "2022-06-01 04:30:00", "2022-06-01 05:00:00", "2022-06-01 05:30:00", "2022-06-01 06:00:00", "2022-11-16 06:30:00", "2022-11-16 07:00:00", "2022-11-16 07:30:00", "2022-11-16 08:00:00" ] # 场景1:Datetime作为索引 df_index = pd.DataFrame({'value': range(len(dt_list))}, index=pd.to_datetime(dt_list)) # 场景2:Datetime作为普通列 df_col = pd.DataFrame({'datetime': pd.to_datetime(dt_list), 'value': range(len(dt_list))})
场景1:Datetime是DataFrame索引
用.loc安全定位时间区间并修改索引:
start = "2022-06-01 02:00:00" end = "2022-06-01 04:00:00" # 方法1:直接定位区间修改 df_index.loc[start:end] = df_index.loc[start:end].assign(index=lambda x: x.index + pd.Timedelta(hours=1)) df_index.index = df_index.index.rename(None) # 无需修改索引名可删除此行 # 方法2:用where条件批量处理(更灵活) target_range = pd.date_range(start, end, freq='30T') df_index.index = df_index.index.where(~df_index.index.isin(target_range), df_index.index + pd.Timedelta(hours=1))
注意:避免直接链式索引(如df_index[start:end].index += ...),这种操作可能修改临时副本而非原DataFrame,导致修改不生效或触发SettingWithCopyWarning。
场景2:Datetime是普通列
用布尔掩码筛选目标区间,通过.loc完成赋值:
start = pd.to_datetime("2022-06-01 02:00:00") end = pd.to_datetime("2022-06-01 04:00:00") # 构造布尔掩码定位目标行 mask = (df_col['datetime'] >= start) & (df_col['datetime'] <= end) # 给区间内的datetime加1小时 df_col.loc[mask, 'datetime'] += pd.Timedelta(hours=1)
关键:必须用.loc同时定位行和列,确保修改的是原DataFrame的数据源,而非临时生成的副本。
内容的提问来源于stack exchange,提问作者user16511234
相关产品推荐
相关产品推荐

