You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于时间范围移动Pandas DataFrame列值的优化方案问询

基于时间范围的时序数据移位方案

问题背景

现有如下时序数据:

timevalues
8/7/2023 00:0041.55
8/7/2023 00:1590.33
8/7/2023 00:3010.00
8/7/2023 00:4511.55
8/7/2023 01:0023.33
8/7/2023 01:1524.00

需求:将flat_start = 00:00至flat_end = 00:30时间范围内的values列值向后移动,该时间范围填充NaN,移动后超出原数据长度的多余值自动移除,预期结果如下:

timevalues
8/7/2023 00:00NaN
8/7/2023 00:15NaN
8/7/2023 00:30NaN
8/7/2023 00:4541.55
8/7/2023 01:0090.33
8/7/2023 01:1510.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:35:08