按ID分组,计算时间序列数据不同时间区间的平均值
按ID分组计算不同时间区间的数值平均值
数据预处理
首先要确保日期列是可比较的datetime类型,避免字符串格式导致的判断错误:
import pandas as pd # 读取数据集(根据你的实际数据源调整,比如Excel或数据库) df = pd.read_csv("your_dataset.csv") # 将日期列转换为datetime格式 df["Date"] = pd.to_datetime(df["Date"]) df["Start_Date"] = pd.to_datetime(df["Start_Date"]) df["End_Date"] = pd.to_datetime(df["End_Date"])
分组计算各区间均值
以下提供两种实用方法,根据你的需求选择:
方法一:自定义分组函数(直接输出汇总结果)
假设每个ID对应的Start_Date和End_Date是唯一的,通过分组后自定义函数计算三个区间的均值:
def compute_interval_means(group): # 获取当前分组的起止日期(取第一个值即可,确保每个ID的起止日期一致) start_date = group["Start_Date"].iloc[0] end_date = group["End_Date"].iloc[0] # 筛选三个区间的数据并计算均值 mean_before = group[group["Date"] < start_date]["Value"].mean() mean_between = group[(group["Date"] >= start_date) & (group["Date"] <= end_date)]["Value"].mean() mean_after = group[group["Date"] > end_date]["Value"].mean() return pd.Series({ "ID": group["ID"].iloc[0], "mean_before_start": mean_before, "mean_between_start_end": mean_between, "mean_after_end": mean_after }) # 应用函数并生成结果表 result_df = df.groupby("ID").apply(compute_interval_means).reset_index(drop=True)
方法二:标记区间后分组统计(保留原数据标记)
如果需要先给每行数据标记所属区间,再进行均值计算:
# 为每行标记所属时间区间 df["interval_tag"] = df.apply( lambda row: "before_start" if row["Date"] < row["Start_Date"] else "between_start_end" if (row["Date"] >= row["Start_Date"]) & (row["Date"] <= row["End_Date"]) else "after_end", axis=1 ) # 按ID和区间分组计算均值,转换为宽表格式 result_df = df.groupby(["ID", "interval_tag"])["Value"].mean().unstack() # 重命名列名更直观 result_df = result_df.rename( columns={ "before_start": "mean_before_start", "between_start_end": "mean_between_start_end", "after_end": "mean_after_end" } ).reset_index()
结果说明
mean_before_start:对应ID下,所有早于Start_Date的数值平均值mean_between_start_end:对应ID下,所有处于Start_Date和End_Date之间(包含两端日期)的数值平均值mean_after_end:对应ID下,所有晚于End_Date的数值平均值- 若某个区间无数据,结果会显示
NaN,可根据业务需求用result_df.fillna(0)或其他方式填充空值
内容的提问来源于stack exchange,提问作者Al. So
相关产品推荐
相关产品推荐

