我有一个Pandas数据框,其中包含两个DateTime列,一个带有'Start_Date',另一个带有'End_Date'。
我想计算一个新的“ Mid_Date”字段(数据框中每个条目的“ Start_Date”和“ End_Date”之间的平均值),但是对于某些行,“ END_DATE”包含“ NULL”(作为文本)串)。对于这些带有“ NULL”的行,我只需要对新的“ Mid_Date”行使用“ START_DATE”。
我不知道如何将其作为函数/ For Loop组合来执行。感谢您提供一些指导。
答案 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