【问题标题】:`to_datetime` limit or misuse? ValueError : Doesn't match format specified`to_datetime` 限制或滥用? ValueError : 与指定的格式不匹配
【发布时间】:2019-11-17 22:06:39
【问题描述】:

我似乎无法将包含日期字符串的系列转换为 dtypedatetime64。 以下代码重现了错误:

import pandas as pd

gud_date_s = pd.Series(["2019/12/31 00:00:00.0"]*100)
gud_date_s2 = pd.Series(["2261/12/31 00:00:00.0"]*100)
bad_date_s = pd.Series(["9999/12/31 00:00:00.0"]*100)
bad_date_s2 = pd.Series(["2262/12/31 00:00:00.0"]*100)


gd1 = pd.to_datetime(gud_date_s, format="%Y/%m/%d", yearfirst=True).dt.date # Correct
gd2 = pd.to_datetime(gud_date_s2 , format="%Y/%m/%d", yearfirst=True).dt.date # Correct
bd1 = pd.to_datetime(bad_date_s, format="%Y/%m/%d", yearfirst=True).dt.date 
#Returns {ValueError}time data 9999/12/31 00:00:00.0 doesn't match format specified.
bd2 = pd.to_datetime(bad_date_s2 , format="%Y/%m/%d", yearfirst=True).dt.date
#Returns {ValueError}time data 2262/12/31 00:00:00.0 doesn't match format specified.

所以接受年份的阈值似乎是2261。为什么?我该如何解决这个问题?

注意:9999/12/31 等日期是相关的,因此我想保持原样。

干杯

【问题讨论】:

    标签: python python-3.x pandas datetime datetime-format


    【解决方案1】:

    这里不是有效值年份9999,因此需要errors='coerce' 转换为NaT

    bd1 = pd.to_datetime(bad_date_s, format="%Y/%m/%d", yearfirst=True, errors='coerce').dt.date
    

    这里出现错误,因为limit,年份是正确的,但最大的月份和日期只有11th April

    不幸的是这里的错误应该更清楚。

    bd2 = pd.to_datetime(bad_date_s2 , format="%Y/%m/%d", yearfirst=True, errors='coerce').dt.date
    
    print (pd.Timestamp.max)
    2262-04-11 23:47:16.8547758
    

    使用日期时间会引发错误:

    from datetime import datetime
    
    d = datetime(year=9999, month=12, day=31)
    bd1 = pd.to_datetime(bad_date_s, format="%Y/%m/%d", yearfirst=True, errors='coerce').dt.date.fillna(d)
    print (bd1)
    

    OutOfBoundsDatetime:越界纳秒时间戳:9999-12-31 00:00:00

    【讨论】:

    • 有没有办法保留9999/12/31 日期?
    • 等一下。我测试一下。
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多