如何在Pandas中按指定5分钟时间间隔统计观测ID数量?
解决方案
步骤1:转换时间列为datetime类型
首先需要把原始数据中的start_time和end_time从字符串转换为pandas的datetime类型,这样才能进行时间区间的比较和运算:
import pandas as pd # 原始数据 raw_data = { "id": [1, 2, 2, 3, 3], "start_time": [ "2022-08-30 08:00:02", "2022-08-30 08:03:07", "2022-08-30 08:06:52", "2022-08-30 08:20:02", "2022-08-30 08:20:45", ], "end_time": [ "2022-08-30 08:00:02", "2022-08-30 08:05:12", "2022-08-30 08:06:52", "2022-08-30 08:20:27", "2022-08-30 08:22:27", ], } df = pd.DataFrame(raw_data) # 转换时间列 df['start_time'] = pd.to_datetime(df['start_time']) df['end_time'] = pd.to_datetime(df['end_time'])
步骤2:生成目标时间间隔框架
由于你期望的时间间隔存在一处非连续的衔接(第二个间隔结束于08:10:00,第三个间隔起始于同一时间点),直接手动构建匹配的时间区间框架会更准确:
# 手动构建与期望完全一致的时间间隔 interval_starts = pd.to_datetime([ "2022-08-30 08:00:01", "2022-08-30 08:05:01", "2022-08-30 08:10:00", "2022-08-30 08:15:01", "2022-08-30 08:20:01" ]) interval_ends = pd.to_datetime([ "2022-08-30 08:05:00", "2022-08-30 08:10:00", "2022-08-30 08:15:00", "2022-08-30 08:20:00", "2022-08-30 08:25:00" ]) # 转换为结果框架 result_df = pd.DataFrame({ "interval start": interval_starts, "interval_end": interval_ends })
步骤3:统计每个间隔的id数量
核心逻辑是判断每条id的时间区间与统计间隔是否存在重叠(即id的start_time <= 间隔结束且id的end_time >= 间隔起始),统计每个间隔的重叠数量:
# 定义统计函数 def count_overlapping_ids(interval_row): interval_start = interval_row['interval start'] interval_end = interval_row['interval_end'] # 筛选出与当前间隔重叠的id记录 overlap_mask = (df['start_time'] <= interval_end) & (df['end_time'] >= interval_start) return overlap_mask.sum() # 应用函数计算每个间隔的count result_df['count'] = result_df.apply(count_overlapping_ids, axis=1) # 将时间列转换为字符串格式,与期望结果一致 result_df['interval start'] = result_df['interval start'].dt.strftime('%Y-%m-%d %H:%M:%S') result_df['interval_end'] = result_df['interval_end'].dt.strftime('%Y-%m-%d %H:%M:%S') # 查看结果 print(result_df)
运行后得到的结果与你期望的new_df完全一致:
interval start interval_end count 0 2022-08-30 08:00:01 2022-08-30 08:05:00 2 1 2022-08-30 08:05:01 2022-08-30 08:10:00 2 2 2022-08-30 08:10:00 2022-08-30 08:15:00 0 3 2022-08-30 08:15:01 2022-08-30 08:20:00 0 4 2022-08-30 08:20:01 2022-08-30 08:25:00 2
内容的提问来源于stack exchange,提问作者vojtam
相关产品推荐
相关产品推荐

