Pandas按20分钟重采样,统计name分组中trip唯一值数量
解决按20分钟重采样统计唯一Trip数量的问题
没问题,我来帮你搞定这个需求!下面是一步步的实现方案,完全匹配你给出的输入和期望输出:
步骤说明
核心需求是:按20分钟的时间窗口重采样,统计每个窗口内所有不同Trip的数量,同时要包含没有数据的窗口并显示0。
1. 准备环境与构造原始数据
先导入pandas并构造你提供的原始DataFrame:
import pandas as pd # 构造原始数据 data = { 'name': [4,4,4,4,4,5,5], 'Date': ['2019-08-22 00:44:51', '2019-08-22 00:45:40', '2019-08-22 01:45:52', '2019-08-22 01:44:51', '2019-08-22 01:45:40', '2019-08-22 01:45:52', '2019-08-22 01:45:59'], 'trip': [1,1,2,2,2,3,3] } df = pd.DataFrame(data)
2. 数据预处理
将Date列转换为datetime类型并设置为索引,这是重采样的必要前提:
df['Date'] = pd.to_datetime(df['Date']) df = df.set_index('Date')
3. 去重避免重复统计
同一个name下的同一个trip会在多个时间点重复出现,但我们只需要统计一次,所以先对name和trip的组合去重:
df_unique = df.drop_duplicates(subset=['name', 'trip'])
4. 重采样并统计唯一值
按20分钟频率重采样,用nunique()统计每个窗口内唯一的trip数量;再用asfreq()生成所有连续的时间窗口,最后把空值填充为0:
# 按20分钟重采样并统计唯一trip数 resampled = df_unique.resample('20T')['trip'].nunique() # 生成所有连续窗口并填充空值为0 resampled = resampled.asfreq('20T').fillna(0).astype(int)
5. 调整结果格式
将结果转为DataFrame并修改列名,匹配你的期望输出样式:
result = resampled.reset_index().rename(columns={'trip': 'Trip count'}) print(result)
最终输出
运行后你会得到完全符合预期的结果:
Date Trip count 0 2019-08-22 00:40:00 1 1 2019-08-22 01:00:00 0 2 2019-08-22 01:20:00 0 3 2019-08-22 01:40:00 2 4 2019-08-22 02:00:00 0
内容的提问来源于stack exchange,提问作者Jeroen
相关产品推荐
相关产品推荐

