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

如何用pandas提取DataFrame日/周/月最后读数至新列

需求说明

大型DataFrame包含两列核心数据:

  • readings:存储采集读数
  • local_date_time:DateTime格式的读数采集本地时间
    需要在原表新增3个独立列,分别存储实际采集到的每日、每周、每月最后一条读数,其中每周最后一天支持自定义(示例要求为周三)。
原有实现的缺陷

原先基于固定时间点匹配的代码如下:

df['Day'] = df['local_date_time'].dt.day    
df['Hour'] = df['local_date_time'].dt.hour
df['Min'] = df['local_date_time'].dt.minute
df.loc[(df['Hour'] == 23) & (df['Min'] >= 59),'end_day'] = df['readings']
df.loc[(df['Hour'] == 23) & (df['Min'] >= 59) & (df['Weekday'] == 'Wednesday'),'end_week'] = df['readings']
df.loc[(df['Hour'] == 23) & (df['Min'] >= 59) & (df['Day'] == 30),'end_month'] = df['readings']

存在两个明确问题:

  • 硬编码匹配23:59的采集时间点,如果当日没有这个时间点的记录,就无法提取当日实际存在的最后一条读数
  • 固定以每月30号作为月末判断条件,无法适配28/29/30/31天的不同月份,周截止日也无法灵活配置
实现方案

核心逻辑是按时间维度给数据打分组标签,自动识别每个分组内时间最晚的记录,不需要硬编码任何时间点,对大型DataFrame运行效率友好。

import pandas as pd

# 前置操作:确保时间列为标准datetime格式
df["local_date_time"] = pd.to_datetime(df["local_date_time"])

# --------------------------
# 配置项:自定义每周最后一天,取值0-6分别对应周一到周日
# 示例设置为2即代表周三为每周最后一天
WEEK_END_DAY = 2
# --------------------------

# 生成各时间维度的分组键(临时列,计算完成后会删除)
# 日维度:按自然日分组
df["_day_group"] = df["local_date_time"].dt.normalize()
# 月维度:按自然月分组
df["_month_group"] = df["local_date_time"].dt.to_period("M").dt.to_timestamp()
# 周维度:按自定义周截止日分组
week_end_label = pd.Timestamp(2023, 1, 2 + WEEK_END_DAY).strftime("%a").upper()
df["_week_group"] = df["local_date_time"].dt.to_period(f"W-{week_end_label}").dt.to_timestamp()

# 遍历各维度,给对应end列赋值:仅组内时间最晚的行填充读数,其余行为空
for group_col, target_col in [
    ("_day_group", "end_day"),
    ("_week_group", "end_week"),
    ("_month_group", "end_month")
]:
    # 计算每个分组内的最大采集时间
    group_max_time = df.groupby(group_col)["local_date_time"].transform("max")
    # 匹配到组内最后一条记录时赋值读数
    df[target_col] = df.loc[df["local_date_time"] == group_max_time, "readings"]

# 清理临时分组列
df.drop(columns=["_day_group", "_week_group", "_month_group"], inplace=True)
方案优势
  • 无硬编码时间点:自动识别每个周期内实际存在的最后一条采集记录,哪怕当日最后一条采集时间是上午9点也能正确匹配
  • 自动适配周期规则:自然月自动识别28/29/30/31天的月末日期,不需要手动判断大小月、闰年2月的天数
  • 周规则灵活调整:仅需修改WEEK_END_DAY的取值即可切换周最后一天,不需要改动核心计算逻辑
  • 性能适配大数据量:基于pandas内置的向量化运算实现,比逐行遍历、多次loc筛选的运行速度快一个数量级以上,适合百万行级的大型DataFrame

验证示例:如果2024年2月(闰年,共29天)最后一条采集记录是29日17:42的读数,代码会自动给该行的end_month列赋值;某周的最后一条采集记录是周三21:08的读数,会自动给该行的end_week列赋值,不会因为时间点不是23:59漏判。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:39:18