You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决函数中的'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:18:30