如何解决函数中的'TypeError: Converting from datetime64[ns] to int32 is not supported'错误
问题解决:datetime转int类型错误
错误原因
执行groupby(["Nominee Grade"]).mean()时,DataFrame中仍保留了Date Raised这个datetime类型列。计算均值后该列未被剔除,后续调用.astype(int)会尝试将datetime类型直接转换为int——这是不被支持的,且你实际上根本不需要日期列的均值结果。
修复方案
在分组聚合时只针对需要计算的Amount Awarded列操作,避免将datetime列纳入聚合范围。具体修改如下:
修改后的完整函数
import pandas as pd import numpy as np def data_award_by_grade(df, x=None): df = df.copy() df = df[["Amount Awarded", "Nominee Grade", "Date Raised"]] target_date = pd.Timestamp("2023-04-01") after_target_date = df[df['Date Raised'] > target_date] if x is not None and x > 0: # 仅对Amount Awarded列做聚合,避免带入Date Raised df_one = after_target_date.groupby(["Nominee Grade"])["Amount Awarded"].mean().astype(int).to_frame() df_one = df_one.rename(columns={'Amount Awarded': 'Total Average'}) x_months_after_date = target_date + pd.DateOffset(days=x * 30) df_two = after_target_date[after_target_date['Date Raised'] <= x_months_after_date] # 同样只聚合目标列 df_two = df_two.groupby(["Nominee Grade"])["Amount Awarded"].mean().astype(int).to_frame() df_two = df_two.rename(columns={'Amount Awarded': f'Average Across {x} Month(s)'}) result_df = df_one.add(df_two, fill_value=0).replace(np.nan, 0).astype(int) else: # 聚合时指定目标列 result_df = after_target_date.groupby(["Nominee Grade"])["Amount Awarded"].mean().astype(int).to_frame() result_df = result_df.rename(columns={'Amount Awarded': 'Total Average'}) return result_df award_by_grade = data_award_by_grade(raw_data, 6) award_by_grade
关键修改点
- 所有
groupby操作后,通过["Amount Awarded"]明确指定要聚合的列,避免默认对所有列(包括datetime列)执行均值计算 - 聚合单列会返回Series,调用
.to_frame()将其转回DataFrame,保证后续操作的一致性
内容的提问来源于stack exchange,提问作者gorilla
相关产品推荐
相关产品推荐

