【问题标题】:Create a new calculate DateTime field from two other fields, conditional on the presence of text从其他两个字段创建一个新的计算 DateTime 字段,以文本的存在为条件
【发布时间】:2020-08-04 06:33:21
【问题描述】:

我有一个 Pandas 数据框,其中包含两个 DateTime 列,一个带有“Start_Date”,另一个带有“End_Date”。

我想计算一个新的“Mid_Date”字段(数据框中每个条目的“Start_Date”和“End_Date”之间的平均值),但对于某些行,“END_DATE”包含“NULL”(作为文本细绳)。对于这些带有“NULL”的行,我只需要将“START_DATE”用于新的“Mid_Date”行。

我不知道如何将其作为函数/For 循环组合来执行。我将不胜感激。

【问题讨论】:

    标签: pandas function datetime for-loop


    【解决方案1】:

    实际上,您不需要在脚本中使用循环来实现此目的。让我们创建一个示例DataFrame。将日期列中的任何“NULL”字符串替换为NaN

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({'Start_Date': ['2020-01-02', '2020-01-09', '2020-01-20'],
                       'End_Date': ['2020-01-06', 'NULL', '2020-01-25']}).replace('NULL', np.nan)
    
    # df
    #    Start_Date    End_Date
    # 0  2020-01-02  2020-01-06
    # 1  2020-01-09         NaN
    # 2  2020-01-20  2020-01-25
    

    现在将所有日期字符串解析为 datetime 对象,然后使用开始日期加上半数增量(以天为单位)计算“Mid_Date”列。请注意,现在您将“Mid_Date”作为 DateTime 列,而不仅仅是 Date。此外,不均匀除以 2 会使结果增加几个小时:

    df[['Start_Date', 'End_Date']] = df[['Start_Date', 'End_Date']].apply(pd.to_datetime)
    
    df['Mid_Date'] = (df.Start_Date + (df.End_Date - df.Start_Date) / 2)
    
    # df
    #   Start_Date   End_Date            Mid_Date
    # 0 2020-01-02 2020-01-06 2020-01-04 00:00:00
    # 1 2020-01-09        NaT                 NaT
    # 2 2020-01-20 2020-01-25 2020-01-22 12:00:00
    

    您现在可以将“Mid_Date”列中的任何“NaN”替换为“Start_Date”列中的值,如果您希望“Mid_Date”成为纯日期列(去除 H:M:S),您可以也可以通过添加.dt.date

    df['Mid_Date'] = df.Mid_Date.fillna(df.Start_Date).dt.date
    
    # df
    #   Start_Date   End_Date    Mid_Date
    # 0 2020-01-02 2020-01-06  2020-01-04
    # 1 2020-01-09        NaT  2020-01-09
    # 2 2020-01-20 2020-01-25  2020-01-22
    

    【讨论】:

    • 看着我,事情过于复杂。谢谢!
    猜你喜欢
    • 2012-07-12
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多