【问题标题】:Pandas: Filling mixed datetime field from another column熊猫:从另一列填充混合日期时间字段
【发布时间】:2020-11-23 09:27:18
【问题描述】:

我有一个日期时间列,其中偶尔缺少日期信息。它只包含小时信息。

        Entry   Init                Edit
    14  1666832 10.10.2002 02:10    10.10.2002 02:10
    15  1675384 13.10.2002 13:49    13.10.2002 13:49
    16  1709573 25.10.2002 14:21    14:23           
    17  1740242 03.11.2002 21:08    03.11.2002 21:08
    18  1751053 05.11.2002 10:46    05.11.2002 10:46

如果“编辑”仅显示小时信息,我想将日期信息添加到“编辑”列,其中包含“初始化”字段中的日期。我写了一个函数,应用到相关领域。

def edit(x,y):
    if len(y) < 16:
        y = f"{x.split(' ')[0]} {y}"
    return y

df["EditDate_proper"] = df.apply(lambda x: edit(x['Init'], x['Edit']), axis=1)

它工作正常,但我想知道是否有一种更聪明的方法来填充类似于“fillna”方法的错误格式的值。例如,“如果此字段不包含 %d.%m.%Y %H:%M 类型的格式,请从该字段的 %d.%M.%Y 信息中获取”

提前致谢。

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    不知道有没有更聪明的方法来填充格式错误的值,类似于“fillna”方法。

    您可以通过to_datetimeto_timedeltaerrors='coerce' 所以如果没有匹配得到缺失值,则删除 Series.dt.floor 的时间,添加到 timedeltas 并最后用转换为日期时间的原始值替换缺失值:

    df['Init'] = pd.to_datetime(df['Init'], errors='coerce')
    timedeltas = pd.to_timedelta(df['Edit'] + ':00', errors='coerce')
    edit_dates = pd.to_datetime(df['Edit'], errors='coerce')
    
    df["EditDate_proper"]  = (timedeltas + df['Init'].dt.floor('d')).fillna(edit_dates)
    print (df)
          Entry                Init              Edit     EditDate_proper
    14  1666832 2002-10-10 02:10:00  10.10.2002 02:10 2002-10-10 02:10:00
    15  1675384 2002-10-13 13:49:00  13.10.2002 13:49 2002-10-13 13:49:00
    16  1709573 2002-10-25 14:21:00             14:23 2002-10-25 14:23:00
    17  1740242 2002-03-11 21:08:00  03.11.2002 21:08 2002-03-11 21:08:00
    18  1751053 2002-05-11 10:46:00  05.11.2002 10:46 2002-05-11 10:46:00
    

    如果想使用字符串:

    m = df['Edit'].str.len() < 16
    df["EditDate_proper"] = df['Init'].mask(m, df['Init'].str.split().str[0] + ' ' + df['Edit'])
    print (df)
          Entry              Init              Edit   EditDate_proper
    14  1666832  10.10.2002 02:10  10.10.2002 02:10  10.10.2002 02:10
    15  1675384  13.10.2002 13:49  13.10.2002 13:49  13.10.2002 13:49
    16  1709573  25.10.2002 14:21             14:23  25.10.2002 14:23
    17  1740242  03.11.2002 21:08  03.11.2002 21:08  03.11.2002 21:08
    18  1751053  05.11.2002 10:46  05.11.2002 10:46  05.11.2002 10:46
    

    【讨论】:

    • 我的第一次尝试确实是使用 errors='coerce' 参数将其转换为 datetime 对象。然后我意识到我不能像处理字符串版本那样处理“NaT”值。您提出的两种方法似乎都很好,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2019-11-12
    • 2018-08-17
    • 2017-02-08
    • 2011-08-03
    • 1970-01-01
    相关资源
    最近更新 更多