Pandas筛选季度最后可用日期行时出现ValueError的解决方法
解决获取季度最后可用日期对应行的报错问题
原始数据集
data = {'Date': ['2022-01-01', '2022-02-15', '2022-03-10', '2022-04-20', '2022-05-05', '2022-06-30', '2022-07-15', '2022-08-10', '2022-09-25', '2022-09-25'], 'Value': [10, 15, 20, 25, 30, 35, 40, 45, 50, 50]}
期望结果
Date Value 0 2022-03-10 20 1 2022-06-30 35 2 2022-09-25 50 3 2022-09-25 50
用户错误代码及报错
错误代码
import pandas as pd # Create sample DataFrame data = {'Date': ['2022-01-01', '2022-02-15', '2022-03-10', '2022-04-20', '2022-05-05', '2022-06-30', '2022-07-15', '2022-08-10', '2022-09-25', '2022-09-25'], 'Value': [10, 15, 20, 25, 30, 35, 40, 45, 50, 50]} df = pd.DataFrame(data) # Convert 'Date' column to datetime format df['Date'] = pd.to_datetime(df['Date']) # Create a new DataFrame with last dates of quarters last_dates = df.resample('Q', on='Date').last().reset_index() # Merge the original DataFrame with the last_dates DataFrame df = pd.merge(df, last_dates, on='Date') print(df)
报错信息
ValueError: cannot insert Date, already exists
问题原因
- 列名冲突:
df.resample('Q', on='Date').last()的结果中,index是每个季度的结束日期(如2022-03-31),列包含原数据的Date和Value;调用reset_index()后,会将季度结束日期作为新列插入,默认列名为Date,导致last_dates中出现两个同名的Date列,触发合并时的列名冲突报错。 - 逻辑偏差:
resample().last()仅会提取每个季度的最后一行数据,无法保留原数据中同一日期的多行记录(如2022-09-25的两行),不符合期望结果。
正确解决方案
通过分组提取每个季度的最后可用日期,再筛选原数据中对应日期的所有行:
import pandas as pd data = {'Date': ['2022-01-01', '2022-02-15', '2022-03-10', '2022-04-20', '2022-05-05', '2022-06-30', '2022-07-15', '2022-08-10', '2022-09-25', '2022-09-25'], 'Value': [10, 15, 20, 25, 30, 35, 40, 45, 50, 50]} df = pd.DataFrame(data) df['Date'] = pd.to_datetime(df['Date']) # 按季度分组,获取每个季度的最后可用日期 quarterly_last_dates = df.groupby(df['Date'].dt.to_period('Q'))['Date'].max().tolist() # 筛选原数据中日期属于季度最后可用日期的所有行 result = df[df['Date'].isin(quarterly_last_dates)] # 可选:重置索引以匹配期望结果的格式 result = result.reset_index(drop=True) print(result)
运行结果
Date Value 0 2022-03-10 20 1 2022-06-30 35 2 2022-09-25 50 3 2022-09-25 50
内容的提问来源于stack exchange,提问作者hyeri
相关产品推荐
相关产品推荐

