我有一个包含两列(dtype = timedelta64[ns]
)的数据框
看起来像这样:
START_TIME RESTORE_TIME
17:17:00 18:46:00
20:07:00 00:44:00
20:07:00 00:45:00
14:16:00 15:50:00
14:16:00 17:55:00
我创建了另一列,它吸收了RESTORE_TIME
与START_TIME
之间的差异。我使用了以下命令:
df['Diff']=df['RESTORE_TIME'] - df2['START_TIME']
我的输出数据框如下:
START_TIME RESTORE_TIME Diff
17:17:00 18:46:00 01:29:00
20:07:00 00:44:00 -1 days +04:37:00
20:07:00 00:45:00 -1 days +04:38:00
14:16:00 15:50:00 01:34:00
14:16:00 17:55:00 03:39:00
我不确定Diff
列为什么在某些值中显示-1 days
?当我在Diff列上执行某些计算时,它没有返回所需的值。例如,如果我取Diff
列的平均值(通过使用命令np.mean(df['Diff'])
,它将返回Timedelta('-1 days +17:35:24')
,这显然不是这种情况。任何人都可以指导我解决问题的方法?
答案 0 :(得分:1)
如果是凌晨12点,您需要在代码中添加以下内容:
from datetime import timedelta
if df['Diff'].days < 0:
df['Diff'] = timedelta(days=0,
seconds=df['Diff'].seconds, microseconds=df['Diff'].microseconds)
答案 1 :(得分:1)
是的。发生这种情况是因为这两行的第二列(RESTORE_TIME)显示了午夜之后的时间。这意味着新的一天已经开始。 我可以考虑使用条件来避免这种情况,例如您可以说
if df2['START_TIME']< df['RESTORE_TIME']:
df['Diff']= df2['START_TIME'] - df['RESTORE_TIME']
else:
df['Diff']= df['RESTORE_TIME'] - df2['START_TIME']
答案 2 :(得分:1)
为了说明这里发生的情况,让我们创建一个虚拟next('router')
,其列类型为newRouter
:
df
如果您查看timedelta的total_seconds,那么如果您将两列的差取为整数,则很清楚发生了什么:
timedelta64[ns]
例如from datetime import timedelta
import pandas as pd
# example df with time columns
df = pd.DataFrame({'START_TIME': pd.Series(pd.to_datetime(['17:17:00','20:07:00','20:07:00','14:16:00','14:16:00'])).dt.time,
'RESTORE_TIME': pd.Series(pd.to_datetime(['18:46:00','00:44:00','00:45:00','15:50:00','17:55:00'])).dt.time})
# to timedelta
df = df.applymap(lambda t: timedelta(hours=t.hour, minutes=t.minute, seconds=t.second))
显然是负数,并且将“ -1天+04:37:00”表示为时间增量。
类似于@Ehsan的回答,您可以应用一个简单的函数来添加一天,以防出现“ START_TIME”>“ RESTORE_TIME”:
df.applymap(lambda t: t.total_seconds())
# START_TIME RESTORE_TIME
# 0 62220.0 67560.0
# 1 72420.0 2640.0
# 2 72420.0 2700.0
# 3 51360.0 57000.0
# 4 51360.0 64500.0