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

为何df.assign未使用参数值?需将release_date改为datetime64类型

解决pandas中动态指定列修改类型的问题

问题场景

我编写了如下Python函数,期望将指定列的类型修改为datetime64:

def change_date_column_type(df,change_column_name):
    
    df=df.assign(change_column_name=df[change_column_name].astype('datetime64'))
    
    # return the result
    return df

调用代码:

result = change_date_column_type(test_df,'release_date')
print(result)

得到的输出却新增了一列change_column_name,而非修改原有的release_date列:

output:
  movie_title  release_date    genre MPAA_rating change_column_name
0     titanic  Dec 21, 1937    Drama           R         1937-12-21
1      frozen   Feb 9, 1940  Musical          PG         1940-02-09
2       rythm  Nov 13, 1940   Family           G         1940-11-13
3   godfather  Nov 12, 1946    Drama           R         1946-11-12
4         red  Feb 15, 1950  Musical       PG-13         1950-02-15

如何让函数修改指定的原列类型,而非创建新列?

原因分析

df.assign()接收的是关键字参数,直接写change_column_name=...时,Python会将change_column_name作为字面量列名处理,而不是读取变量change_column_name的实际值,因此生成了新列而非覆盖原列。

解决方案

方案1:字典解包实现动态列名

将目标列名和转换后的数据构造为字典,通过**解包传递给assign(),即可用变量值作为列名覆盖原列:

def change_date_column_type(df, change_column_name):
    df = df.assign(**{change_column_name: df[change_column_name].astype('datetime64')})
    return df

方案2:直接修改列(推荐,更直观)

先复制原DataFrame避免修改原始数据,再直接对目标列进行类型转换:

def change_date_column_type(df, change_column_name):
    df_copy = df.copy()
    df_copy[change_column_name] = df_copy[change_column_name].astype('datetime64')
    return df_copy

方案3:使用pd.to_datetime处理日期(更可靠)

如果原始列是字符串格式,pd.to_datetime()比astype()兼容性更强,能自动识别多种日期格式,还可通过format参数指定格式:

import pandas as pd

def change_date_column_type(df, change_column_name):
    df_copy = df.copy()
    df_copy[change_column_name] = pd.to_datetime(df_copy[change_column_name])
    return df_copy

内容的提问来源于stack exchange,提问作者shiviz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:45:39