【问题标题】:Give default datetime object value to pandas.to_datetime()将默认日期时间对象值赋予 pandas.to_datetime()
【发布时间】:2018-05-16 01:48:14
【问题描述】:

我有一些不同格式的字符串日期,我使用to_datetime() 将它们转换为日期时间对象。但是,字符串列表也有一些我想转换为默认日期的垃圾值。

import pandas as pd
import datetime as dt

print(df)

       dates
0   2018-02-12
1   2018-03-19
2   12-24-2018
3   garbage

我使用errors='coerece' 来避免抛出异常。它产生NaT,在我的情况下,我想将其转换为默认日期 2018-12-31。

df['dates'] = pd.to_datetime(df['dates'], errors='coerce')

下面的结果。

      dates
0   2018-02-12
1   2018-03-19
2   2018-12-24
3   NaT

方法:

我正在检查给定的值是否是有效的日期时间。如果没有,请放置默认的日期时间对象。但由于某种原因,它会生成所有默认值。

df['dates'].apply(lambda x: dt.datetime(2018,12,31) if x is not dt.datetime else x)

电流输出

     dates
0   2018-12-31
1   2018-12-31
2   2018-12-31
3   2018-12-31

预期输出:

     dates
0   2018-02-12
1   2018-03-19
2   2018-12-24
3   2018-12-31

有没有办法给 to_datetime() 函数提供一个默认日期,这样它就不会产生 NaT?如果没有,我该如何设置默认日期?

【问题讨论】:

    标签: python-3.x pandas datetime


    【解决方案1】:

    您只需要在pd.to_datetime 调用后的末尾添加fillna

    pd.to_datetime(df['dates'], errors='coerce').fillna(pd.to_datetime('2018-12-31'))
    Out[217]: 
    0   2018-02-12
    1   2018-03-19
    2   2018-12-24
    3   2018-12-31
    Name: dates, dtype: datetime64[ns]
    

    【讨论】:

    • 感谢您的快速回答。我想知道我的 .apply() 逻辑有什么问题?为什么 NaT 也被视为日期时间对象?
    • @RoboCoder 改成df['dates'].apply(lambda x: dt.datetime(2018,12,31) if isinstance(x, datetime.date) else x)
    • 我试过了,但它仍然会将所有内容转换为 2018-12-31。我还检查了type(df['dates'][0]),即pandas._libs.tslib.Timestamp。不应该是datetime 对象吗?
    • @RoboCoder 我认为这里的逻辑错误df['dates'].apply(lambda x: x if isinstance(x, datetime.date) else dt.datetime(2018,12,31))
    • 它仍然给我相同的所有默认日期。我想,这是我应该问的一个单独的问题。 @文
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2011-12-03
    • 2012-12-07
    • 2012-07-11
    相关资源
    最近更新 更多