基于时间范围移动Pandas DataFrame列值的优化方案问询
基于时间范围的时序数据移位方案
问题背景
现有如下时序数据:
| time | values |
|---|---|
| 8/7/2023 00:00 | 41.55 |
| 8/7/2023 00:15 | 90.33 |
| 8/7/2023 00:30 | 10.00 |
| 8/7/2023 00:45 | 11.55 |
| 8/7/2023 01:00 | 23.33 |
| 8/7/2023 01:15 | 24.00 |
需求:将flat_start = 00:00至flat_end = 00:30时间范围内的values列值向后移动,该时间范围填充NaN,移动后超出原数据长度的多余值自动移除,预期结果如下:
| time | values |
|---|---|
| 8/7/2023 00:00 | NaN |
| 8/7/2023 00:15 | NaN |
| 8/7/2023 00:30 | NaN |
| 8/7/2023 00:45 | 41.55 |
| 8/7/2023 01:00 | 90.33 |
| 8/7/2023 01:15 | 10.00 |
目前已使用df.shift(periods=3)实现,但希望找到基于时间范围的更优方案。
基于时间范围的解决方案
这种方案不依赖固定行数,直接通过时间范围定位操作,适配性更强(比如时间间隔不固定、时间范围对应的行数未知的场景),具体实现步骤如下:
1. 数据预处理
先将time列转换为datetime类型,确保时间操作的准确性:
import pandas as pd # 构造原始数据 data = { 'time': ['8/7/2023 00:00', '8/7/2023 00:15', '8/7/2023 00:30', '8/7/2023 00:45', '8/7/2023 01:00', '8/7/2023 01:15'], 'values': [41.55, 90.33, 10.00, 11.55, 23.33, 24.00] } df = pd.DataFrame(data) df['time'] = pd.to_datetime(df['time'])
2. 定义目标时间范围
将需要处理的时间范围转换为datetime对象:
flat_start = pd.to_datetime('8/7/2023 00:00') flat_end = pd.to_datetime('8/7/2023 00:30')
3. 执行移位操作
通过布尔索引定位时间范围,提取对应值后填充NaN,再将提取的值移到后续位置:
# 筛选目标时间范围内的行 mask = (df['time'] >= flat_start) & (df['time'] <= flat_end) shift_values = df.loc[mask, 'values'].values # 将原时间范围的values设为NaN df.loc[mask, 'values'] = pd.NA # 计算填充起始位置:目标范围最后一行的下一个索引 start_fill_idx = df[mask].index[-1] + 1 # 将提取的值填充到后续行,超出原数据长度的部分自动截断 df.loc[start_fill_idx : start_fill_idx + len(shift_values) - 1, 'values'] = shift_values
方案优势
- 无需提前计算时间范围对应的行数,直接通过时间条件定位,避免手动调整
periods参数 - 适配时间间隔不固定的时序数据,鲁棒性更强
- 逻辑清晰,操作过程可追溯,便于维护
内容的提问来源于stack exchange,提问作者Rajan Kumar Yadav
相关产品推荐
相关产品推荐

