如何将30分钟间隔的Pandas数据转换为小时级数据?
将30分钟间隔的Pandas数据集转换为小时级数据
需求说明
给定包含id、date、val字段的Pandas DataFrame(时间间隔30分钟),需按以下规则转换为小时级数据:
- 同一
id、同一小时内的多条数据:对val求和,保留该小时的第一个时间点 - 整点时间且无同小时其他数据:直接保留该条数据
- 跨日期的数据需按日期分别处理
示例输入数据
import pandas as pd df = pd.DataFrame() df['id'] = [1, 1, 2, 2, 3,3,3,3,4,4,4,4,4,4] df['date'] = [ '2012-02-10 8:00:00', '2012-02-10 8:30:00', '2012-02-10 8:00:00', '2012-02-10 9:00:00', '2012-02-10 8:00:00', '2012-02-10 8:30:00', '2012-02-10 9:00:00', '2012-02-11 9:30:00', '2012-02-11 9:00:00', '2012-02-11 9:30:00', '2012-02-11 10:00:00', '2012-02-11 11:00:00', '2012-02-11 11:30:00', '2012-02-11 12:00:00' ] df['val'] = [10,10,2,2,3,3,4,5,1,2,3,4,5,6]
期望输出
id date val 1 2012-02-10 08:00:00 20 2 2012-02-10 08:00:00 2 2 2012-02-10 09:00:00 2 3 2012-02-10 08:00:00 6 3 2012-02-10 09:00:00 4 3 2012-02-11 09:30:00 5 4 2012-02-11 09:00:00 3 4 2012-02-11 10:00:00 3 4 2012-02-11 11:00:00 9 4 2012-02-11 12:00:00 6
解决方案代码
# 1. 清理并转换时间字段 df['date'] = df['date'].str.replace('\s+', ' ', regex=True).str.strip() df['date'] = pd.to_datetime(df['date']) # 2. 构造分组键:确保按id、日期、小时分组(跨日期的同一小时分开处理) df['group_date'] = df['date'].dt.date df['group_hour'] = df['date'].dt.hour # 3. 分组聚合:求和val,保留每组第一个时间点 result_df = df.groupby(['id', 'group_date', 'group_hour'], as_index=False).agg( date=('date', 'first'), val=('val', 'sum') ) # 4. 整理结果列,移除辅助分组列 result_df = result_df[['id', 'date', 'val']] # 查看结果 print(result_df.to_string(index=False))
代码说明
- 时间字段预处理:先清理字符串中的多余空格和换行,再转换为
datetime类型,确保后续时间操作准确 - 分组逻辑:通过
id+日期+小时的组合键分组,严格区分跨日期的同一小时数据 - 聚合操作:对每个分组的
val求和,同时取分组内第一个date作为保留的时间点,完全符合需求规则
内容的提问来源于stack exchange,提问作者White cow
相关产品推荐
相关产品推荐

