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

pandas中apply方法调用pd.to_datetime的参数传递问题

pandas apply调用pd.to_datetime参数传递问题解析

示例数据

import pandas as pd
d = {'date': ['5/2/2000'], 'date2': ['3/02/2000'], 'date3': ['1-2-2000']}
df = pd.DataFrame(data=d)
print(df.dtypes)

三种写法的原因拆解

1. 正常运行的lambda写法

df[['date', 'date2', 'date3']] = df[['date', 'date2', 'date3']].apply(lambda x: pd.to_datetime(x, dayfirst=True))
# 输出
#     date        date2       date3
# 0   2000-02-05  2000-02-03  2000-02-01

原理:apply运行时会按默认axis=0逐列遍历,把每一列数据作为参数传入lambda匿名函数,再由lambda把数据和dayfirst=True参数一起传给pd.to_datetime执行,参数传递完整,因此能正确按日在前的英国格式解析日期。

2. 结果错误的无参写法

df[['date', 'date2', 'date3']] = df[['date', 'date2', 'date3']].apply(pd.to_datetime)
# 输出(错误)
#     date        date2       date3
# 0   2000-05-02  2000-03-02  2000-01-02

原因:这里直接把pd.to_datetime的函数引用传给apply,apply会自动把遍历到的列数据作为第一个必填参数传给pd.to_datetime,但没有传入dayfirst参数,pd.to_datetime默认使用月在前的美国格式解析,因此结果不符合预期。

3. 报错的直接传参写法

df[['date', 'date2', 'date3']] = df[['date', 'date2', 'date3']].apply(pd.to_datetime(dayfirst=True))
# 报错信息
# TypeError: to_datetime() missing 1 required positional argument: 'arg'

原因:pd.to_datetime(dayfirst=True)是直接执行函数调用的表达式,Python会在把参数传给apply前就先运行这句代码,此时你没有传入pd.to_datetime必填的第一个参数(要解析的日期数据),因此直接触发参数缺失报错,完全没有进入apply的执行逻辑。

通用规则说明

这是Python高阶函数的通用规则,并非pandas apply独有:所有接收可调用对象作为入参的方法(比如apply、map、sorted的key参数等),都要求传入函数引用(不带括号的函数名、lambda、偏函数等),如果加了括号就会当场执行函数,把函数返回值传给方法,而非传递函数本身供后续调用。
除了lambda写法外,pandas apply本身支持直接传入额外的关键字参数,更简洁的正确写法如下:

df[['date', 'date2', 'date3']] = df[['date', 'date2', 'date3']].apply(pd.to_datetime, dayfirst=True)

apply会自动把后面追加的关键字参数传递给内部调用的pd.to_datetime,效果和lambda写法完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:27:03