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

在Pandas中为大型DataFrame新增时间间隔分组列

针对大型Pandas DataFrame按时间间隔分组的高效方案

嘿,针对你这个4000万行的超大DataFrame分组需求,我整理了几个高性能的实现方案——毕竟数据量这么大,必须优先考虑速度和内存效率:

前提:确定你的时间间隔

首先得明确你想要的时间间隔单位,比如1分钟、5分钟、1小时、1天等等,下面的例子我会用常见的间隔来演示,你可以根据需求调整。


方案1:利用Pandas datetime的向量化操作(直观易读)

先把Unix时间戳转成datetime类型,再用dt.floor/dt.round/dt.ceil来生成分组键,这种方法可读性强,适合大多数场景:

import pandas as pd

# 假设你的DataFrame已经加载完成
# 第一步:把TIMESTAMP(秒级Unix时间戳)转成datetime列
df['datetime'] = pd.to_datetime(df['TIMESTAMP'], unit='s')

# 示例:按1小时间隔分组,将时间向下取整到最近的小时作为分组标识
df['group_id'] = df['datetime'].dt.floor('H')

# 如果你想要用数字而非datetime作为分组值,可以转成整数时间戳(秒级)
df['group_id'] = df['datetime'].dt.floor('H').astype('int64') // 10**9
  • dt.floor:将时间向下取整到指定间隔(比如1小时的话,17:39会变成17:00)
  • dt.round:四舍五入到指定间隔
  • dt.ceil:向上取整到指定间隔
    你可以根据业务需求选择合适的取整方式。

方案2:直接对时间戳做数学运算(性能最优)

因为TIMESTAMP是秒级Unix时间戳,我们可以跳过datetime转换,直接用整数运算生成分组键,这种方法速度最快、内存占用最低,非常适合超大数据集:

# 定义你需要的时间间隔(秒):比如1小时=3600秒,5分钟=300秒
interval = 3600

# 生成分组键:同一间隔内的时间戳会得到相同的结果
df['group_id'] = (df['TIMESTAMP'] // interval) * interval

# 可选:如果想要用连续递增的整数作为分组值(比如0,1,2...),用factorize映射
df['group_id_num'], _ = pd.factorize(df['group_id'])

原理很简单:用整除运算把时间戳归到对应的间隔起始点,比如1483243205(17:39:57)除以3600得到412012,乘以3600后得到1483243200(17:00:00),同一小时内的所有时间戳都会得到这个值。


性能优化小贴士

  • 避免循环/Apply:上面的两种方法都是Pandas的向量化操作,速度比循环快几个数量级,绝对不能用df.apply来处理4000万行数据。
  • 内存优化:如果分组键用整数类型,可以指定dtype='int32'(确保数值范围足够的情况下),减少内存占用。
  • 边读边处理:如果是从CSV/数据库读取数据,可以在读取时就完成时间戳转换和分组,避免加载全量数据后再处理导致内存溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:25:15