You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 01:51:03