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

如何使用Pandas高效批量识别并格式化日期时间列(规避apply)

避免用apply批量格式化Pandas日期时间列的高效方案

你的核心需求是替换低效的apply操作,用Pandas原生的向量化方法批量格式化日期时间列——这完全可行,因为Pandas的dt访问器本身就支持向量化操作,不需要逐列循环。

第一步:修正日期列识别的代码错误

原代码里select_dtypes的语法有误,少了一个闭合括号,正确写法是:

datetime_cols = test_tz_df.select_dtypes(include=["datetime64[ns]"]).columns.to_list()

第二步:用向量化操作替换apply

直接对选中的日期列子集调用dt.strftime,不需要apply,Pandas会自动对每一列执行向量化的格式化:

# 直接向量化格式化,无需apply
test_tz_df[datetime_cols] = test_tz_df[datetime_cols].dt.strftime('%Y-%m-%d %H:%M:%S')

为什么这更高效?

  • apply(lambda x: x.dt.strftime(...))本质是逐列循环,每一列都要单独调用一次dt.strftime,大数据集下会有明显性能损耗。
  • 直接对列子集调用dt.strftime是真正的向量化操作,Pandas会利用底层C扩展批量处理所有数据,速度能提升几十倍甚至上百倍(取决于数据集大小)。

完整可运行代码

import pandas as pd

# 创建测试DataFrame
test_tz_df = pd.DataFrame(
    {
        'With tz': [(pd.to_datetime('today') - pd.DateOffset(days=1)).tz_localize(tz='America/Los_Angeles').tz_localize(None)]*2,
        'Without tz': [(pd.to_datetime('today') - pd.DateOffset(days=1))]*2,
        'strings': ['string a','string b']
    }
)

# 正确识别日期时间列
datetime_cols = test_tz_df.select_dtypes(include=["datetime64[ns]"]).columns.to_list()

# 高效的向量化格式化
test_tz_df[datetime_cols] = test_tz_df[datetime_cols].dt.strftime('%Y-%m-%d %H:%M:%S')

print(test_tz_df)

额外优化:处理带时区的日期列

如果你的日期列带时区(比如原代码里的With tz列),需要保留时区并格式化的话,可以先转换到目标时区再操作:

# 示例:带时区的列格式化(保留时区标识)
test_tz_df['With tz'] = test_tz_df['With tz'].dt.tz_localize('America/Los_Angeles').dt.strftime('%Y-%m-%d %H:%M:%S %Z')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:30:15