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

如何用Python逐年按日递增统计事件数?含无事件与重复日期处理

Python实现全年事件递增统计(含无事件日期保持、重复日期累加)

核心需求拆解

  • 重复日期事件:按日期出现次数累加当日事件数
  • 无事件日期:累计事件数与前一日保持一致
  • 覆盖全年日期:生成完整年度日期序列并计算每日累计

方法一:使用Pandas实现(高效简洁)

Pandas处理日期序列和统计计算非常便捷,适合数据量较大的场景。

步骤1:准备原始事件数据

假设我们有如下事件日期列表(重复日期对应多个事件):

event_dates = [
    "2023-01-01", "2023-01-01", "2023-01-03",
    "2023-01-05", "2023-01-05", "2023-01-05",
    "2023-01-07", "2023-01-10"
]

步骤2:统计每日事件频次

import pandas as pd

# 转换为日期格式并统计每个日期的事件数
daily_events = pd.Series(event_dates).value_counts().sort_index()
daily_events.index = pd.to_datetime(daily_events.index)

步骤3:生成全年完整日期序列

# 指定目标年份
target_year = 2023
# 生成全年每日日期
full_date_range = pd.date_range(
    start=f"{target_year}-01-01",
    end=f"{target_year}-12-31",
    freq="D"
)

步骤4:填充日期并计算累计数

# 初始化全年事件数为0,用实际统计结果更新
full_daily_data = pd.Series(0, index=full_date_range)
full_daily_data.update(daily_events)

# 计算累计事件数(无事件日期因当日数为0,累计值与前一日一致)
cumulative_data = full_daily_data.cumsum()

# 整理成可读性强的DataFrame
result_df = pd.DataFrame({
    "日期": full_date_range.strftime("%Y-%m-%d"),
    "当日事件数": full_daily_data.values,
    "累计事件数": cumulative_data.values
})

# 查看前10条结果
print(result_df.head(10))

输出示例

日期  当日事件数  累计事件数
0  2023-01-01       2        2
1  2023-01-02       0        2
2  2023-01-03       1        3
3  2023-01-04       0        3
4  2023-01-05       3        6
5  2023-01-06       0        6
6  2023-01-07       1        7
7  2023-01-08       0        7
8  2023-01-09       0        7
9  2023-01-10       1        8

方法二:纯Python实现(无依赖)

如果不想使用第三方库,可以用标准库实现相同逻辑。

步骤1:准备数据与统计频次

from collections import Counter
from datetime import datetime, timedelta

event_dates = [
    "2023-01-01", "2023-01-01", "2023-01-03",
    "2023-01-05", "2023-01-05", "2023-01-05",
    "2023-01-07", "2023-01-10"
]

# 转换为datetime对象并统计频次
date_objs = [datetime.strptime(d, "%Y-%m-%d") for d in event_dates]
daily_counts = Counter(date_objs)

步骤2:生成全年日期序列

target_year = 2023
start_date = datetime(target_year, 1, 1)
end_date = datetime(target_year, 12, 31)

full_dates = []
current = start_date
while current <= end_date:
    full_dates.append(current)
    current += timedelta(days=1)

步骤3:计算累计事件数

cumulative = 0
result_list = []

for date in full_dates:
    # 获取当日事件数,无事件则为0
    daily_num = daily_counts.get(date, 0)
    cumulative += daily_num
    result_list.append({
        "日期": date.strftime("%Y-%m-%d"),
        "当日事件数": daily_num,
        "累计事件数": cumulative
    })

# 打印前10条结果
for item in result_list[:10]:
    print(item)

输出示例

{'日期': '2023-01-01', '当日事件数': 2, '累计事件数': 2}
{'日期': '2023-01-02', '当日事件数': 0, '累计事件数': 2}
{'日期': '2023-01-03', '当日事件数': 1, '累计事件数': 3}
{'日期': '2023-01-04', '当日事件数': 0, '累计事件数': 3}
{'日期': '2023-01-05', '当日事件数': 3, '累计事件数': 6}
{'日期': '2023-01-06', '当日事件数': 0, '累计事件数': 6}
{'日期': '2023-01-07', '当日事件数': 1, '累计事件数': 7}
{'日期': '2023-01-08', '当日事件数': 0, '累计事件数': 7}
{'日期': '2023-01-09', '当日事件数': 0, '累计事件数': 7}
{'日期': '2023-01-10', '当日事件数': 1, '累计事件数': 8}

内容的提问来源于stack exchange,提问作者Mihai Dudnic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:42:45