根据文本的存在,从其他两个字段中创建一个新的计算DateTime字段

时间:2020-04-21 13:30:46

标签: pandas function datetime for-loop

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

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

我不知道如何将其作为函数/ ​​For Loop组合来执行。感谢您提供一些指导。

1 个答案:

答案 0 :(得分:0)

实际上,您不需要在脚本中循环即可实现此目的。让我们创建一个示例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”作为纯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