Pandas DataFrame datetime列调用strftime转字符串时出现TypeError错误求助
解决pandas datetime列转字符串时的TypeError问题
我来帮你拆解问题根源,再给出高效的解决办法:
错误原因
你直接调用datetime.strftime()的写法有问题——这个方法必须被具体的datetime实例调用(比如某个时间对象.strftime(格式字符串)),但你用apply(axis=1)时,是把整行的Series对象传给了这个函数,这就导致类型完全不匹配:strftime期望接收datetime实例,结果收到了Series(过程中被识别为类似str的对象),所以抛出了那个报错。
而且更关键的是,pandas处理datetime列有专门的高效工具,完全没必要用apply(axis=1)这种逐行处理的低效率方式。
正确解决方案(推荐)
使用pandas的.dt访问器,它是专门为datetime类型的Series/列设计的,可以直接对整列批量操作,效率比apply高很多:
# 先定义需要转换的datetime列列表 datetime_cols = ['startedAt','lastUpdatedAt', 'dataPullStartTime', 'dataPullEndTime'] # 用.dt.strftime批量转换为指定格式的字符串 test_df[datetime_cols] = test_df[datetime_cols].dt.strftime('%Y-%m-%d %H:%M:%S.%f')
特殊场景下的apply写法(不推荐)
如果因为某些特殊需求必须用apply,那需要在lambda里对每个元素单独调用strftime:
datetime_cols = ['startedAt','lastUpdatedAt', 'dataPullStartTime', 'dataPullEndTime'] test_df[datetime_cols] = test_df[datetime_cols].apply( lambda col: col.apply(lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S.%f')) )
或者逐行处理的写法:
test_df[datetime_cols] = test_df[datetime_cols].apply( lambda row: row.apply(lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S.%f')), axis=1 )
额外提示
你的datetime列是带本地时区的(tzlocal()),如果需要在转换后的字符串中保留时区信息,可以把格式字符串改成'%Y-%m-%d %H:%M:%S.%f %z',这样输出的字符串会包含时区偏移量。
内容的提问来源于stack exchange,提问作者anon_39
相关产品推荐
相关产品推荐

