如何用Pandas的groupby/聚合函数规整带不规则时间戳的地铁站数据?
需求说明
我有一份不同地铁站的每小时进出站记录数据集,部分地铁站因运营时间导致时间增量存在不规则间隔(比如部分站点17:30关闭,对应行的时间戳为05:30:00,其余行时间戳的分钟部分均为0)。我希望将数据标准化为小时级间隔,把这些不规则的30分钟时间戳数据合并到对应整点的记录中(即站点在05:30:00的进出站数与05:00:00的数值求和)。能否用groupby/聚合函数实现该需求?
示例数据
import pandas as pd df = pd.DataFrame( {'Date Time':pd.to_datetime(['2023-01-01 00:00:00', '2023-01-01 00:00:00', '2023-01-01 00:00:00', '2023-01-01 00:30:00', '2023-01-01 00:30:00', '2023-01-01 00:30:00', '2023-01-01 01:00:00', '2023-01-01 01:00:00', '2023-01-01 01:00:00']), 'Station':['Station A', 'Station B', 'Station C', 'Station A', 'Station B', 'Station C','Station A', 'Station B', 'Station C'], 'Entries':[1, 2, 3, 1, 2, 3, 1, 2, 3], 'Exits':[1, 2, 3, 1, 2, 3, 1, 2, 3]} )
原始数据
| Date Time | Station | Entries | Exits |
|---|---|---|---|
| 2023-01-01 00:00:00 | Station A | 1 | 1 |
| 2023-01-01 00:00:00 | Station B | 2 | 2 |
| 2023-01-01 00:00:00 | Station C | 3 | 3 |
| 2023-01-01 00:30:00 | Station A | 1 | 1 |
| 2023-01-01 00:30:00 | Station B | 2 | 2 |
| 2023-01-01 00:30:00 | Station C | 3 | 3 |
| 2023-01-01 01:00:00 | Station A | 1 | 1 |
| 2023-01-01 01:00:00 | Station B | 2 | 2 |
| 2023-01-01 01:00:00 | Station C | 3 | 3 |
期望输出
| Date Time | Station | Entries | Exits |
|---|---|---|---|
| 2023-01-01 00:00:00 | Station A | 2 | 2 |
| 2023-01-01 00:00:00 | Station B | 4 | 4 |
| 2023-01-01 00:00:00 | Station C | 6 | 6 |
| 2023-01-01 01:00:00 | Station A | 1 | 1 |
| 2023-01-01 01:00:00 | Station B | 2 | 2 |
| 2023-01-01 01:00:00 | Station C | 3 | 3 |
解决方案
可以通过groupby结合时间戳的整点归一化实现,核心思路是把所有时间戳向下取整到最近的整点,再按整点时间和站点分组聚合求和。
实现代码
# 将Date Time列向下取整到小时级别 df['Hourly Time'] = df['Date Time'].dt.floor('H') # 按Hourly Time和Station分组,对Entries和Exits求和 result = df.groupby(['Hourly Time', 'Station'])[['Entries', 'Exits']].sum().reset_index() # 重命名列名匹配期望输出 result = result.rename(columns={'Hourly Time': 'Date Time'}) print(result)
输出结果
Date Time Station Entries Exits 0 2023-01-01 00:00:00 Station A 2 2 1 2023-01-01 00:00:00 Station B 4 4 2 2023-01-01 00:00:00 Station C 6 6 3 2023-01-01 01:00:00 Station A 1 1 4 2023-01-01 01:00:00 Station B 2 2 5 2023-01-01 01:00:00 Station C 3 3
说明
dt.floor('H')会将任意时间戳向下取整到最近的整点,比如00:30:00转换为00:00:00,05:30:00转换为05:00:00,正好满足将30分钟数据合并到对应整点的需求。- 同时按整点时间和站点分组聚合,确保每个站点每个整点的进出站数是该时段内所有记录的总和。
内容的提问来源于stack exchange,提问作者Paul Song
相关产品推荐
相关产品推荐

