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

计算DataFrame某列与特定参考行的差值问题

高效计算每日特定时间基准的DataFrame差值

针对百万级分钟粒度的工作日数据,要以每日08:30:00的Data1值为基准计算差值,推荐用提取基准表+关联合并的方案,完全避免低效递归,具体实现如下:

核心思路

  1. 从原数据中提取每日08:30:00的Data1值,生成当日基准值表
  2. 将基准表与原表按Date关联,让每行数据匹配到对应日期的基准值
  3. 通过布尔索引快速计算差值,08:30之前的行差值设为0(可按需调整规则)

代码实现(Pandas)

1. 构造示例数据(模拟你的业务场景)

import pandas as pd

data = {
    'Date': ['2022-01-03']*6,
    'Time': ['08:28:00', '08:29:00', '08:30:00', '08:31:00', '08:32:00', '08:33:00'],
    'Data1': [4778.14, 4784.23, 4785.15, 4785.01, 4787.83, 4788.80]
}
df = pd.DataFrame(data)

2. 提取每日基准值

# 筛选每日08:30:00的行,仅保留日期和基准值列并重命名
benchmark_df = df[df['Time'] == '08:30:00'][['Date', 'Data1']].rename(columns={'Data1': 'Daily_Benchmark'})

3. 关联基准值到原表

# 按Date左关联,确保原表所有行都能匹配到当日基准
merged_df = df.merge(benchmark_df, on='Date', how='left')

4. 高效计算差值

用布尔索引替代逐行遍历,性能更适配百万级数据:

# 初始化差值列为0
merged_df['Diff'] = 0

# 筛选08:30及之后的行,计算Data1与基准值的差值
time_threshold = '08:30:00'
mask = merged_df['Time'] >= time_threshold
merged_df.loc[mask, 'Diff'] = merged_df.loc[mask, 'Data1'] - merged_df.loc[mask, 'Daily_Benchmark']

# 保留两位小数(按需调整精度)
merged_df['Diff'] = merged_df['Diff'].round(2)

最终结果输出

print(merged_df[['Date', 'Time', 'Data1', 'Diff']])

输出与你给出的示例完全一致:

Date      Time    Data1   Diff
0 2022-01-03  08:28:00  4778.14   0.00
1 2022-01-03  08:29:00  4784.23   0.00
2 2022-01-03  08:30:00  4785.15   0.00
3 2022-01-03  08:31:00  4785.01  -0.14
4 2022-01-03  08:32:00  4787.83   2.68
5 2022-01-03  08:33:00  4788.80   3.65

性能优化提示

  • 若Time列是datetime类型,可提取时间部分(df['Time'] = df['Datetime'].dt.time)后再筛选基准行
  • Pandas的merge和布尔索引均为向量化操作,处理百万级数据的效率远高于循环或递归调用lag/diff

内容的提问来源于stack exchange,提问作者Sundancer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:45:57