Python Pandas按月末最后日期筛选数据报错求助
问题解决:按月筛选每月最后一条数据并修复resample报错
报错根源:你处理日期时把pd.to_datetime()生成的datetime类型转成了Python原生的date对象,而pandas的resample方法要求索引必须是**datetime64[ns]**类型,不是原生date对象,这才导致了异常(报错信息描述存在误导,但核心是索引类型不符合要求)。
解决方案步骤
1. 修正日期索引的处理逻辑
不要用.dt.date把datetime转成date对象,直接保留datetime64类型作为索引:
import pandas as pd # 原始数据 data = { 'Date': ['1/5/22', '1/6/22', '1/8/22', '2/10/22', '2/28/22', '3/15/22', '3/21/22', '3/25/22'], 'A': [4, 8, 1, 4, 6, 6, 0, 5], 'B': [5, 3, 5, 8, 4, 0, 0, 7] } df = pd.DataFrame(data) # 正确的日期处理:转成datetime64类型,直接设为索引 df['Date'] = pd.to_datetime(df['Date']) df.set_index('Date', inplace=True)
2. 使用resample获取每月最后一条数据
现在索引是datetime64类型,resample("M").last()就能正常工作:
result = df.resample("M").last() # 若想更灵活地按年月分组取最后一行,也可以用: # result = df.groupby([df.index.year, df.index.month]).last()
3. 格式还原(可选)
如果需要将日期转回1/8/22这类格式,可添加以下步骤:
result.reset_index(inplace=True) result['Date'] = result['Date'].dt.strftime('%m/%d/%y')
最终结果
处理后会得到你需要的目标数据:
| Date | A | B |
|---|---|---|
| 1/8/22 | 1 | 5 |
| 2/28/22 | 6 | 4 |
| 3/25/22 | 5 | 7 |
替代实现方案(无需修改索引)
如果不想改动原始索引结构,也可以用分组+取最大值日期的方式实现:
df['Date'] = pd.to_datetime(df['Date']) result = df.groupby(df['Date'].dt.to_period('M')).apply(lambda x: x.loc[x['Date'].idxmax()])
内容的提问来源于stack exchange,提问作者Saanchi
相关产品推荐
相关产品推荐

