如何用Pandas DataFrame按分钟统计带时间戳数据的行数?
如何用Pandas统计每分钟的行数?
刚好做过类似的需求,我来一步步拆解怎么实现你要的效果:
第一步:先把时间戳转成Pandas能识别的格式
首先得确保你的时间戳列是datetime类型,不然没法按时间维度分组。先构造示例数据并转换格式:
import pandas as pd # 你的示例数据 data = { 'timestamp': ['00:00:01', '00:00:21', '00:02:02', '00:02:10', '00:02:31'], 'data': ['data1', 'data2', 'data3', 'data4', 'data5'] } df = pd.DataFrame(data) # 把字符串转成datetime类型,这里用%H:%M:%S匹配时分秒格式 df['timestamp'] = pd.to_datetime(df['timestamp'], format='%H:%M:%S')
第二步:按分钟统计行数(处理缺失分钟是关键)
直接用resample方法按分钟('min')重采样,统计每组的行数。不过这里要注意:如果某个分钟没有数据,resample默认不会显示它,所以我们需要补全这些缺失的分钟,填充0。
先做基础统计:
# 按分钟分组统计行数 minute_counts = df.resample('min', on='timestamp').size()
这时候得到的结果是:
timestamp 2024-05-20 00:00:00 2 2024-05-20 00:02:00 3 Freq: T, dtype: int64
可以看到00:01分钟的记录直接缺失了,接下来我们要补全这个时间段。
第三步:补全缺失分钟并得到最终列表
生成从第一个分钟到最后一个分钟的完整时间序列,然后把统计结果对齐上去,缺失的填0:
# 生成完整的分钟范围:从最早的分钟到最晚的分钟 start_min = df['timestamp'].dt.floor('min').min() end_min = df['timestamp'].dt.floor('min').max() full_minutes = pd.date_range(start=start_min, end=end_min, freq='min') # 重新索引,缺失的位置填充0 filled_counts = minute_counts.reindex(full_minutes, fill_value=0) # 转成列表就是你要的结果 result = filled_counts.tolist() print(result) # 输出: [2, 0, 3]
简化版代码(一步到位)
如果想简化代码,可以把逻辑合并成链式调用:
import pandas as pd data = { 'timestamp': ['00:00:01', '00:00:21', '00:02:02', '00:02:10', '00:02:31'], 'data': ['data1', 'data2', 'data3', 'data4', 'data5'] } df = pd.DataFrame(data) df['timestamp'] = pd.to_datetime(df['timestamp'], format='%H:%M:%S') result = ( df.resample('min', on='timestamp') .size() .reindex( pd.date_range( df['timestamp'].dt.floor('min').min(), df['timestamp'].dt.floor('min').max(), freq='min' ), fill_value=0 ) .tolist() ) print(result) # [2, 0, 3]
小补充
如果你的时间戳包含日期(比如2024-05-20 00:00:01),这个方法完全适用,resample会自动按「日期+分钟」的维度分组统计,补全逻辑也一样。
内容的提问来源于stack exchange,提问作者Federico Caccia
相关产品推荐
相关产品推荐

