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

如何按年份拆分含datetime64类型日期列的DataFrame?

嘿,我太懂你这种手动拆分年份的痛苦了——要是数据里年份多几个,那代码得写得老长,维护起来简直要命!咱们来把这个流程彻底简化,用更灵活、更易维护的方法搞定它。

首先,先把你原来的代码里的冗余步骤砍掉:提取年份其实不用pd.DatetimeIndex,直接用dt.year就够简洁了:

df['Year'] = df['Data'].dt.year

接下来是核心的拆分步骤,最推荐的方式是用字典存储各个年份的DataFrame,这比手动命名每个df_2005、df_2006灵活太多,不管数据里有多少年份都能自动适配:

# 用字典推导式一键拆分,自动去掉Year列
year_dfs = {year: group.drop('Year', axis=1) for year, group in df.groupby('Year')}

现在要访问某一年的数据直接用键就行,比如year_dfs[2005]就是2005年的DataFrame,year_dfs[2008]就是2008年的,完全不用手动写筛选和删列的重复代码。

如果你确实需要单独的变量(比如像原来那样有df_2005这种独立的DataFrame),也可以用循环自动生成,不用逐个手动赋值:

for year, group in df.groupby('Year'):
    # 动态创建变量名,比如df_2005、df_2006
    globals()[f'df_{year}'] = group.drop('Year', axis=1)

对比你原来的代码,这个方案的优势太明显了:

  • 可扩展性拉满:不管数据新增多少年份,代码完全不用改,自动适配
  • 代码量骤减:十几行的手动操作浓缩成几行,可读性还更强
  • 避免人为错误:不用复制粘贴筛选条件,减少写错年份的概率

最后,顺便提一句,你生成测试数据的status部分也可以简化,用np.random.choice更高效:

status = np.random.choice(['X', 'y', 'z'], size=len(date), p=[0.9, 0.05, 0.05])

这样整个流程就清爽多啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:52:33