在计算日期之间的差异时,pd.Timedelta会额外增加一天

2024-06-11 00:50:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下熊猫数据帧df

Actual                  Scheduled
2017-01-01 04:03:00.000 2017-01-01 04:25:00.000
2017-01-01 04:56:00.000 2017-01-01 04:55:00.000
2017-01-01 04:36:00.000 2017-01-01 05:05:00.000
2017-01-01 06:46:00.000 2017-01-01 06:55:00.000
2017-01-01 06:46:00.000 2017-01-01 07:00:00.000

我需要创建一个额外的列DIFF_MINUTES,它包含ActualScheduledActual - Scheduled)之间的差异(以分钟为单位)

这就是我试图解决这项任务的方式:

import pandas as pd
import datetime

df["Actual"] = df.apply(lambda row: datetime.datetime.strptime(str(row["Actual"]),"%Y-%m-%d %H:%M:%S.%f"), axis=1)
df["Scheduled"] = df.apply(lambda row: datetime.datetime.strptime(str(row["Scheduled"]),"%Y-%m-%d %H:%M:%S.%f"), axis=1)
df["DIFF_MINUTES"] = df.apply(lambda row: (pd.Timedelta(row["Actual"]-row["Scheduled"]).seconds)/60, axis=1)

但是,对于负差异情况,我得到了错误的结果(例如,04:03:00-04:25:00应该给出22分钟,而不是1418分钟):

Actual                      Scheduled              DIFF_MINUTES
2017-01-01 04:03:00         2017-01-01 04:25:00    1418.0
2017-01-01 04:56:00         2017-01-01 04:55:00    1.0
2017-01-01 04:36:00         2017-01-01 05:05:00    1411.0
2017-01-01 06:46:00         2017-01-01 06:55:00    1431.0
2017-01-01 06:46:00         2017-01-01 07:00:00    1426.0

如何修复它

预期结果:

Actual                      Scheduled              DIFF_MINUTES
2017-01-01 04:03:00         2017-01-01 04:25:00    -22.0
2017-01-01 04:56:00         2017-01-01 04:55:00    1.0
2017-01-01 04:36:00         2017-01-01 05:05:00    -29
2017-01-01 06:46:00         2017-01-01 06:55:00    -9.0
2017-01-01 06:46:00         2017-01-01 07:00:00    -14.0

Tags: lambdaimportdfdatetimediff差异rowpd
2条回答

假设两列都是日期时间,只运行:

df['DIFF_MINUTES'] = (df.Actual - df.Scheduled).dt.total_seconds() / 60

(一艘班轮)

如果从Excel或CSV文件中读取此数据框,请添加 parse_dates=[0,1]参数将这些列转换为日期, 这样就不需要通过代码强制转换它们

如果出于某种原因,您将这些列设置为文本,则 将其转换为运行:

df.Actual = pd.to_datetime(df.Actual)
df.Scheduled = pd.to_datetime(df.Scheduled)

(另一种比“普通Python”函数更快的解决方案)

使用^{}作为(同时检查列中的日期是第一个月还是第一个月):

df['Actual']  = pd.to_datetime(df['Actual'], dayfirst=True)
df['Scheduled']  = pd.to_datetime(df['Scheduled'], dayfirst=True)
df['DIFF_MINUTES'] = (df['Actual']-df['Scheduled']).dt.total_seconds()/60

print(df)
               Actual           Scheduled  DIFF_MINUTES
0 2017-01-01 04:03:00 2017-01-01 04:25:00         -22.0
1 2017-01-01 04:56:00 2017-01-01 04:55:00           1.0
2 2017-01-01 04:36:00 2017-01-01 05:05:00         -29.0
3 2017-01-01 06:46:00 2017-01-01 06:55:00          -9.0
4 2017-01-01 06:46:00 2017-01-01 07:00:00         -14.0

相关问题 更多 >