熊猫:时差列返回-1天

时间:2020-05-12 00:26:58

标签: python python-3.x pandas dataframe datetime

我有一个包含两列(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_TIMESTART_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'),这显然不是这种情况。任何人都可以指导我解决问题的方法?

3 个答案:

答案 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