如何基于date列30分钟间隔用Pandas聚合Reddit GME帖子数据
按30分钟间隔聚合GME帖子数据集的Pandas实现方案
前置准备:转换时间字段
必须先将date字段转换为Pandas可识别的datetime格式,否则无法执行时间聚合操作:
import pandas as pd # 读入数据集(json格式数据对应替换为pd.read_json即可) df = pd.read_csv("你的GME帖子数据集路径.csv") # 转换date为datetime类型,异常时间自动设为NaT df["date"] = pd.to_datetime(df["date"], errors="coerce") # 剔除时间无效的行 df = df.dropna(subset=["date"])
核心聚合方案(两种实现按需选择)
方案1:resample标准时间重采样(适合中小数据集,自动生成连续时间索引)
resample是时间序列聚合的标准工具,可自动补全无帖子的空窗口,生成的连续时间索引可直接适配时间序列分析场景:
agg_df = df.resample( rule="30T", # 指定聚合窗口为30分钟,新版Pandas也可写"30min" on="date", # 指定聚合依据的时间列,无需修改原表索引 origin="start_day", # 从自然日0点开始划分窗口(如00:00-00:30、00:30-01:00),无需该规则可删除 label="right" # 窗口标签默认取窗口结束时间(如10:00-10:30的窗口标签为10:30),要取窗口起点可改为"left" ).agg( 帖子数=("id", "nunique"), # 统计窗口内唯一帖子数(用Reddit帖子唯一id去重) 总得分=("score", "sum"), # 窗口内所有帖子的score总和 平均得分=("score", "mean"), # 窗口内帖子的平均score 帖子内容合集=("post", lambda x: list(x)) # 需保留窗口内所有帖子原文可保留,不需要可删除 ) # 可选:空窗口的数值指标补0,适配时间序列模型输入 agg_df[["帖子数", "总得分", "平均得分"]] = agg_df[["帖子数", "总得分", "平均得分"]].fillna(0)
方案2:时间分桶+groupby(适合超大规模数据集,性能更高)
如果数据集行数超过百万级、resample运行性能较低时,可先将每个帖子的时间映射到所属30分钟窗口,再用groupby聚合:
# 生成每个帖子对应的30分钟窗口起点(要从自然日0点划分就加origin="start_day",不需要可删除) df["time_window"] = df["date"].dt.floor("30T", origin="start_day") agg_df = df.groupby("time_window").agg( 帖子数=("id", "nunique"), 总得分=("score", "sum"), 平均得分=("score", "mean") )
常用调整说明
- 窗口自定义:如果需要从固定时间点开始划分30分钟段(而非自然日0点),在
resample/dt.floor中传入origin="你的指定时间点"即可,比如origin="2020-01-01 13:00"。 - 时区处理:如果
date字段带时区信息,转datetime时可传入tz="UTC"统一为UTC时区,避免跨时区偏移问题。 - 空窗口处理:若不需要保留无帖子的空时间段,直接用方案2即可;用方案1的话加
agg_df = agg_df.dropna()删除空窗口行。
内容的提问来源于stack exchange,提问作者Viol1997
相关产品推荐
相关产品推荐

