如何基于含start_date和end_date的DataFrame生成每日日期计数表
区间日期计数Pandas实现方案
首先先做数据预处理,确保两列日期为datetime类型,避免字符串比较出错:
import pandas as pd # 示例数据,你可以替换成自己的DataFrame df = pd.DataFrame({ 'ID': [1,2,3], 'start_date': ['01/01/2021', '02/01/2021', '01/01/2021'], 'end_date': ['03/01/2021', '04/01/2021', '04/01/2021'] }) # 转datetime类型,注意你的日期格式是日/月/年,对应format参数 df['start_date'] = pd.to_datetime(df['start_date'], format='%d/%m/%Y') df['end_date'] = pd.to_datetime(df['end_date'], format='%d/%m/%Y')
方案1:直观遍历法(适合千级数据量,你的2000条足够用)
逻辑简单易理解,小数据量下运行速度无压力:
# 生成所有需要统计的连续日期 min_date = df['start_date'].min() max_date = df['end_date'].max() all_dates = pd.date_range(min_date, max_date, freq='D') # 逐日期统计落在区间内的记录数 counts = [((df['start_date'] <= d) & (df['end_date'] >= d)).sum() for d in all_dates] # 生成结果DataFrame result = pd.DataFrame({ 'date': all_dates, 'count': counts }) # 如果需要输出原格式的日期字符串,加这一行 result['date'] = result['date'].dt.strftime('%d/%m/%Y')
方案2:差分法(效率更高,适合后续数据量增长到万/十万级场景)
通过标记区间起止点的增减量,累加得到计数,时间复杂度更低:
# 生成事件列表:起始日+1,结束日的后一天-1 events = [] for _, row in df.iterrows(): events.append((row['start_date'], 1)) # 因为是闭区间,结束日当天还要计数,减1操作放在后一天 events.append((row['end_date'] + pd.Timedelta(days=1), -1)) # 事件按日期排序 events_df = pd.DataFrame(events, columns=['date', 'delta']).sort_values('date') # 生成全量日期序列,和事件表合并 full_dates = pd.date_range(df['start_date'].min(), df['end_date'].max(), freq='D').to_frame(name='date') merged = pd.merge(full_dates, events_df, on='date', how='left').fillna(0) # 累加增量得到每日计数 merged['count'] = merged['delta'].cumsum() result = merged[['date', 'count']].copy() # 同样可按需转日期字符串格式 result['date'] = result['date'].dt.strftime('%d/%m/%Y')
两种方案跑出来的结果都和你给出的示例完全一致。
内容的提问来源于stack exchange,提问作者pip
相关产品推荐
相关产品推荐

