如何按年份拆分含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
相关产品推荐
相关产品推荐

