【问题标题】:Correcting dates with apply function pandas使用 apply 函数 pandas 更正日期
【发布时间】:2025-12-10 23:15:01
【问题描述】:

我有一个日期格式如下的 DataFrame:

12/31/2000 20:00 (月/日/年时:分)

问题是数据集中有一些日期是错误的,例如:

10/12/2003 24:00 应该是 10/13/2003 00:00

这是我运行 dfUFO[wrongFormat] 时得到的结果

所以我在熊猫笔记本中有以下代码来重新格式化这些日期:

def convert2400ToTimestamp(x) :
    date = pd.to_datetime(x.datetime.split(" ")[0], format='%m/%d/%Y')
    return date + pd.Timedelta(days=1)

wrongFormat = dfUFO.datetime.str.endswith("24:00", na=False)    
dfUFO[wrongFormat] = dfUFO[wrongFormat].apply(convert2400ToTimestamp, axis=1)

这段代码导致

ValueError: Must have equal len keys and value when setting with an iterable

我真的不明白这个错误是什么意思。我错过了什么?

编辑:改为

dfUFO.loc[wrongFormat, 'datetime'] = dfUFO[wrongFormat].apply(convert2400ToTimestamp, axis=1)

但 datetime 现在显示日期 10/11/2006

的值,例如 1160611200000000000

【问题讨论】:

    标签: python pandas datetime dataframe timestamp


    【解决方案1】:

    您可以将datetime 列解析为“正确命名”的部分并使用pd.to_datetime()

    来源 DF:

    In [14]: df
    Out[14]:
                    datetime
    388  10/11/2006 24:00:00
    693   10/1/2001 24:00:00
    111   10/1/2001 23:59:59
    

    矢量化解:

    In [11]: pat = r'(?P<month>\d{1,2})\/(?P<day>\d{1,2})\/(?P<year>\d{4}) (?P<hour>\d{1,2})\:(?P<minute>\d{1,2})\:(?P<second>\d{1,2})'
    
    In [12]: df.datetime.str.extract(pat, expand=True)
    Out[12]:
        month day  year hour minute second
    388    10  11  2006   24     00     00
    693    10   1  2001   24     00     00
    111    10   1  2001   23     59     59
    
    In [13]: pd.to_datetime(df.datetime.str.extract(pat, expand=True))
    Out[13]:
    388   2006-10-12 00:00:00
    693   2001-10-02 00:00:00
    111   2001-10-01 23:59:59
    dtype: datetime64[ns]
    

    来自docs

    从 DataFrame 的多列中组装日期时间。按键 可以是常见的缩写,如:

    ['year', 'month', 'day', 'minute', 'second','ms', 'us', 'ns']

    或相同的复数

    【讨论】:

    • 不错的答案。我不知道你可以在这样的DF 级别上使用pd.to_datetime