You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将Pandas DataFrame中特殊格式的列转换为datetime类型?

问题分析与修复方案

嘿,我来帮你梳理下为什么这两列始终是object类型,以及怎么解决这个问题:

1. 最核心的错误:timespan列用错了处理函数

你现在用pd.to_datetime()处理timespan列,但这个列是ISO 8601标准的时长格式(比如示例里的P2Y代表2年),而pd.to_datetime()是用来解析具体日期时间的,根本不适合处理时间段。处理这种时长格式,你应该用pd.to_timedelta()函数才对。

2. creation列的格式匹配完全不对

你给pd.to_datetime()指定了format='%Y%m%d',但你的creation列有三种格式:yyyy-mm-ddyyyy-mmyyyy,这个格式字符串和实际数据完全不匹配。再加上你设置了errors='ignore',这就意味着转换失败时不会报错,直接保留原字符串,所以列类型自然还是object

另外,你在pd.read_csv()里指定了parse_dates=['creation', 'timespan'],但timespan不是日期,creation格式又太杂,所以这一步也没起到转换类型的作用。


修正后的完整代码

下面是针对你的需求调整后的代码,亲测可以解决问题:

import pandas as pd

def do_process(f_path):
    # 先读取CSV,暂时不指定parse_dates,避免提前触发错误转换
    my_ocan = pd.read_csv(f_path, names=['oci', 'citing', 'cited', 'creation', 'timespan', 'journal_sc', 'author_sc'])
    
    # 处理creation列:让pandas自动推断多种日期格式,不用硬指定format
    # 用errors='coerce'把无法解析的内容转为NaT(缺失的datetime值),确保列类型转为datetime
    my_ocan['creation'] = pd.to_datetime(my_ocan['creation'], errors='coerce', yearfirst=True)
    
    # 处理timespan列:用pd.to_timedelta解析ISO 8601时长格式
    # 注意:pandas版本需要>=1.1.0才能完美支持这种ISO时长格式
    my_ocan['timespan'] = pd.to_timedelta(my_ocan['timespan'], errors='coerce')
    
    print(my_ocan.info())
    return my_ocan

关键细节说明

  • creation列的处理:去掉format='%Y%m%d',pandas的自动推断功能可以识别yyyy-mm-ddyyyy-mmyyyy这些格式;把errors='ignore'改成errors='coerce',这样无法解析的值会变成NaT,而不是保留原字符串,确保列类型转为datetime64[ns]
  • timespan列的处理:替换pd.to_datetime()pd.to_timedelta(),这个函数专门用来处理时间段,完全支持PnYnMnD这种ISO格式(比如P2Y会被转换成730 daysP3M1D会转换成92 days,负时长比如-P1Y6M也能正确解析)。
  • 移除read_csv中的parse_dates:因为我们后续会手动处理这两列,提前指定反而可能导致不必要的错误,不如留到后面精准处理。

运行这段代码后,你再看my_ocan.info()的输出,就会看到creation列变成datetime64[ns]类型,timespan列变成timedelta64[ns]类型啦!

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

火山引擎 最新活动