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

Pandas:如何统计跨多年日期区间的每年战争数量?

优雅解决Pandas中跨年份区间的战争数量统计问题

嗨,这个场景我太熟悉了!用嵌套循环确实又麻烦又低效,Pandas其实有非常简洁的标准方案,核心思路是先把每个战争覆盖的所有年份拆出来,再按年份分组计数,完全不需要手动遍历。我给你一步步演示:

第一步:对齐数据结构(先处理日期类型)

首先要确保你的日期列是datetime类型,我先构造一个样例数据方便演示:

import pandas as pd

data = {
    '战争名称': ['战争A', '战争B', '战争C'],
    '开始日期': ['2018-03-15', '2019-11-20', '2020-05-01'],
    '结束日期': ['2020-08-25', '2020-02-10', '2022-12-31']
}
df = pd.DataFrame(data)
# 务必把日期列转为datetime类型,方便提取年份
df['开始日期'] = pd.to_datetime(df['开始日期'])
df['结束日期'] = pd.to_datetime(df['结束日期'])

第二步:生成每个战争覆盖的年份列表

用apply结合range函数,为每一行战争生成它跨越的所有年份(包括开始和结束年份):

df['覆盖年份'] = df.apply(
    lambda row: list(range(row['开始日期'].year, row['结束日期'].year + 1)),
    axis=1
)

这一步之后,每个战争条目会对应一个包含所有覆盖年份的列表,比如战争A会生成[2018,2019,2020]。

第三步:展开列表并分组计数

用explode把列表拆成单独的行,然后按年份分组统计数量即可:

# 把年份列表展开为多行,每个年份对应一行原战争数据
yearly_wars = df.explode('覆盖年份')
# 按年份分组,统计每组的战争数量
yearly_count = yearly_wars.groupby('覆盖年份')['战争名称'].count().reset_index(name='战争数量')

运行后你会得到这样的结果:

覆盖年份战争数量
20181
20192
20203
20211
20221

为什么这个方法更好?

  • 完全避免了嵌套循环,利用Pandas的矢量化操作,处理大数据集时效率提升非常明显
  • 代码简洁易读,逻辑清晰,后期维护成本低
  • 自动处理了各种边界情况:比如战争跨年(12月到次年1月)、持续多年等,都能正确统计到对应的年份

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:14:03