如何用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
相关产品推荐
相关产品推荐

