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

如何优雅提取时间序列中每日首尾值与极值

按日汇总时间序列数据:获取起始值、极值与结束值

最优解决方案

不需要拆分日期和时间列,直接借助Pandas的groupby+agg方法就能一次性完成所有需求,代码简洁高效,适配万行级别的数据量:

import pandas as pd

# 确保时间列是datetime类型(若原始数据未转换)
df['时间'] = pd.to_datetime(df['时间'])

# 若数据未按时间升序排列,先执行排序(保证first/last取到当日首尾时间的数值)
df = df.sort_values('时间')

# 按日期分组,一次性计算所有所需指标
daily_summary = df.groupby(df['时间'].dt.date).agg(
    起始值=('数值', 'first'),
    最小值=('数值', 'min'),
    最大值=('数值', 'max'),
    结束值=('数值', 'last')
).reset_index().rename(columns={'时间': '日期'})

代码说明

  1. 时间类型转换:将时间列转为datetime类型,才能使用dt.date提取日期部分完成分组。
  2. 排序(必要前提):如果原始数据的时间不是升序排列,first和last会取分组内DataFrame的首尾行,而非当日最早/最晚时间的数值,所以排序是关键步骤。
  3. 分组聚合:
    • groupby(df['时间'].dt.date):直接按日期分组,无需额外拆分列。
    • agg()方法一次性定义所有聚合规则:
      • 起始值=('数值', 'first'):取当日最早时间对应的数值(分组后第一行)。
      • 最小值=('数值', 'min'):提取当日所有数值的最小值。
      • 最大值=('数值', 'max'):提取当日所有数值的最大值。
      • 结束值=('数值', 'last'):取当日最晚时间对应的数值(分组后最后一行)。
  4. 索引与列名调整:reset_index()将分组的日期从索引转为列,rename把列名改为目标格式的日期。

对比原方法的优势

  • 省去拆分多列、多次分组再合并的繁琐操作,代码量减少一半以上。
  • 聚合操作一次性完成,Pandas内部优化过的分组逻辑远快于手动循环或多步拆分。
  • 逻辑直观,所有需求在一个agg操作中清晰体现,可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:58:09