【发布时间】:2021-05-13 15:08:37
【问题描述】:
假设我有一个这样的数据框
df1:
datetime1 datetime2
0 2021-05-09 19:52:14 2021-05-09 20:52:14
1 2021-05-09 19:52:14 2021-05-09 21:52:14
2 NaN NaN
3 2021-05-09 16:30:14 NaN
4 NaN NaN
5 2021-05-09 12:30:14 2021-05-09 14:30:14
我想比较 datetime1 和 datetime2 中的时间戳,并用它们之间的差异创建一个新列。
在某些情况下,我在 datetime1 和 datetime2 中没有值,或者我在 datatime1 中有值但在 datatime2 中没有值,所以有一种可能的方法可以在“差异”中获取 NaN如果在 datetime1 和 2 中没有时间戳,并且仅在 datetime1 中有时间戳,则获取与 datetime.now() 相比的差异并将其放在另一列中。
理想的df输出:
datetime1 datetime2 Difference in H:m:s Compared with datetime.now()
0 2021-05-09 19:52:14 2021-05-09 20:52:14 01:00:00 NaN
1 2021-05-09 19:52:14 2021-05-09 21:52:14 02:00:00 NaN
2 NaN NaN NaN NaN
3 2021-05-09 16:30:14 NaN NaN e.g(04:00:00)
4 NaN NaN NaN NaN
5 2021-05-09 12:30:14 2021-05-09 14:30:14 02:00:00 NaN
我尝试了@AndrejKesely 的解决方案,但如果 datetime1 和 datetime2 中没有时间戳,则会失败:
def strfdelta(tdelta, fmt):
d = {"days": tdelta.days}
d["hours"], rem = divmod(tdelta.seconds, 3600)
d["minutes"], d["seconds"] = divmod(rem, 60)
return fmt.format(**d)
# if datetime1/datetime2 aren't already datetime, apply `.to_datetime()`:
df["datetime1"] = pd.to_datetime(df["datetime1"])
df["datetime2"] = pd.to_datetime(df["datetime2"])
df["Difference in H:m:s"] = df.apply(
lambda x: strfdelta(
x["datetime2"] - x["datetime1"],
"{hours:02d}:{minutes:02d}:{seconds:02d}",
),
axis=1,
)
print(df)
【问题讨论】:
-
你能不能只做
df.dropna(inplace=True)去掉 NaN 值然后做这个方法? -
它正在删除具有 NaN 值的行,我不想删除它们。我希望它们出现在我在问题中提到的理想数据帧输出中。
标签: python python-3.x pandas dataframe compare