如何解决将数据帧列中的时间戳与熊猫进行比较
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)
解决方法
您可以先将 NaN
列中的所有 datetime2
值替换为 datetime.now
值。因此,如果 datetime1
是 datetime1
,则可以更轻松地将 NaN
与现在进行比较。
你可以这样做:
df["datetime2"] = df["datetime2"].fillna(value=pandas.to_datetime('today').normalize(),axis=1)
那么你只剩下两个条件:
- 如果
datetime1
列为空,则结果为NaN
。 - 否则,结果是
datetime1
和datetime2
列之间的差异(因为NaN
列中没有剩余的datetime2
)。
您可以使用:
import numpy as np
df["Difference in H:m:s"] = np.where(
df["datetime1"].isnull(),pd.NA,df["datetime2"] - df["datetime1"]
)
您最终可以使用您提供的函数将您的 Difference in H:m:s
格式化为所需的格式:
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)
df["Difference in H:m:s"] = df.apply(
lambda x: strfdelta(
x["Difference in H:m:s"],"{hours:02d}:{minutes:02d}:{seconds:02d}",),axis=1,)
完整代码为:
import numpy as np
# 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["datetime2"] = df["datetime2"].fillna(value=pandas.to_datetime('today').normalize(),axis=1)
df["Difference in H:m:s"] = np.where(
df["datetime1"].isnull(),df["datetime2"] - df["datetime1"]
)
def strfdelta(tdelta,)
,
通过使用布尔索引(掩码)只选择符合条件的行来做你需要的,让 Pandas 用 NaN 填充缺失值:
def strfdelta(td: pd.Timestamp):
seconds = td.total_seconds()
hours = int(seconds // 3600)
minutes = int((seconds % 3600) // 60)
seconds = int(seconds % 60)
return f"{hours:02}:{minutes:02}:{seconds:02}"
bm1 = df["datetime1"].notna() & df["datetime2"].notna()
bm2 = df["datetime1"].notna() & df["datetime2"].isna()
df["Difference in H:m:s"] = (df.loc[bm1,"datetime2"] - df.loc[bm1,"datetime1"]).apply(strfdelta)
df["Compared with datetime.now()"] = (datetime.now() - df.loc[bm2,"datetime1"]).apply(strfdelta)
>>> df
datetime1 datetime2 Diff... Comp...
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 NaT NaT NaN NaN
3 2021-05-09 16:30:14 NaT NaN 103:09:19
4 NaT NaT NaN NaN
5 2021-05-09 12:30:14 2021-05-09 14:30:14 02:00:00 NaN
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。