如何用Python提取DataFrame中每年每月的最新日期数据?
提取DataFrame中每年每月最新日期的完整数据
问题描述
我有一个包含date和input列的DataFrame,希望提取每年每个月最新日期对应的全部列数据。
示例DataFrame:
date input 2017-04-06 0.036 2017-04-13 0.055 2017-04-20 0.07 2017-04-27 0.052 2017-05-04 0.039 2017-05-11 0.045 2017-05-18 0.033 2017-05-25 0.025 2017-06-01 0.018 2017-06-08 0.057 2017-06-15 0.05 2017-06-22 0.035 2017-06-29 0.038
期望得到的DataFrame:
date input 2017-04-27 0.052 2017-05-25 0.025 2017-06-29 0.038
我尝试使用.max()方法,但仅能获取整个date列的最新日期,无法获取每年每月最新日期对应的完整数据,请问如何用Python实现该需求?
解决方案
方法一:按年和月分组筛选最大日期行
先将date列转为datetime类型,再按年份和月份分组,筛选每组中日期最大的行:
import pandas as pd # 创建示例DataFrame df = pd.DataFrame({ 'date': ['2017-04-06', '2017-04-13', '2017-04-20', '2017-04-27', '2017-05-04', '2017-05-11', '2017-05-18', '2017-05-25', '2017-06-01', '2017-06-08', '2017-06-15', '2017-06-22', '2017-06-29'], 'input': [0.036, 0.055, 0.07, 0.052, 0.039, 0.045, 0.033, 0.025, 0.018, 0.057, 0.05, 0.035, 0.038] }) # 转换date列为datetime类型 df['date'] = pd.to_datetime(df['date']) # 分组并筛选每组最大日期的行 result = df.groupby([df['date'].dt.year, df['date'].dt.month]) \ .apply(lambda x: x[x['date'] == x['date'].max()]) \ .reset_index(drop=True) print(result)
方法二:排序后去重(高效推荐)
先按date降序排序,再按年、月保留每组第一行(即最新日期行):
import pandas as pd df['date'] = pd.to_datetime(df['date']) # 按日期降序排序 df_sorted = df.sort_values('date', ascending=False) # 按年和月去重,保留第一行 result = df_sorted.drop_duplicates( subset=[df_sorted['date'].dt.year, df_sorted['date'].dt.month], keep='first' ).sort_values('date') # 最后按日期升序整理 print(result)
方法三:用idxmax获取索引提取行
通过idxmax找到每组最大日期的行索引,再提取对应数据:
import pandas as pd df['date'] = pd.to_datetime(df['date']) # 获取每组最大日期的行索引 max_date_idx = df.groupby([df['date'].dt.year, df['date'].dt.month])['date'].idxmax() # 根据索引提取目标行 result = df.loc[max_date_idx].sort_values('date') print(result)
以上三种方法均可实现需求,其中方法二和方法三在处理大数据集时效率更优。
内容的提问来源于stack exchange,提问作者yangyang
相关产品推荐
相关产品推荐

