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

如何高效从DataFrame字符串列提取年月及解决datetime相关问题

解决方案

一、高效提取年份和月份

针对大数据集,矢量化操作是远快于apply+lambda的选择,推荐两种方法:

方法1:字符串拆分(最快,无需转日期)

利用Pandas的str.split矢量化拆分字符串,直接提取年月并转整数:

# 拆分并扩展为两列,转整数类型
df[['Year', 'Month']] = df['Year-Month'].str.split('-', expand=True).astype(int)

方法2:转datetime后提取(适合后续需日期运算的场景)

先将字符串转为datetime类型,再通过dt属性提取年月:

# 转为datetime(默认当月第一天)
df['Year-Month_dt'] = pd.to_datetime(df['Year-Month'])
# 提取年和月
df['Year'] = df['Year-Month_dt'].dt.year
df['Month'] = df['Year-Month_dt'].dt.month

这两种方法都是Pandas底层优化的矢量化操作,在100万+行的数据集上,速度会比apply快10~100倍。


二、解决时区不兼容的计算错误

问题根源

pd.to_datetime转换"2022-10"这类字符串时,默认生成**无时区感知(naive)的datetime对象;而你的timestamp列是带UTC时区的时区感知(tz-aware)**对象,两者无法直接运算,导致类型错误。

解决步骤

  1. 将Year-Month列转为带UTC时区的datetime
    指定utc=True时配合format参数明确格式,避免解析错误,同时提升转换速度:

    # 转成UTC时区的datetime(默认当月第一天00:00:00 UTC)
    df['Year-Month_utc'] = pd.to_datetime(df['Year-Month'], format='%Y-%m', utc=True)
    
  2. 排查转换报错的原因
    如果指定utc=True报错,大概率是存在格式不规范的行,先定位脏数据:

    # 找出转换失败的行
    invalid_rows = df[pd.to_datetime(df['Year-Month'], format='%Y-%m', errors='coerce').isna()]
    print(invalid_rows)
    

    清理或修正这些行后再重新转换即可。

  3. 统一时区后进行计算
    确保timestamp列也是UTC时区的tz-aware对象(如果是unix时间戳,需先转换):

    # 假设timestamp是秒级unix时间戳,转成UTC时区datetime
    df['utc_timestamp'] = pd.to_datetime(df['timestamp_col'], unit='s', utc=True)
    # 现在可以正常计算时间差等操作
    df['time_diff'] = df['utc_timestamp'] - df['Year-Month_utc']
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:45:32