如何将时差限制在同一天?

How to restrict time difference to same day?

我有一个如下所示的数据框

df1 = pd.DataFrame({
     'subject_id':[1,1,1,1,1,1,1,1,1,1,1],
     'time_1' :['2173-04-03 12:35:00','2173-04-03 12:50:00','2173-04-03 
           12:59:00','2173-04-03 13:14:00','2173-04-03 13:37:00','2173-04-04 
           11:30:00','2173-04-05 16:00:00','2173-04-05 22:00:00','2173-04-06 
           04:00:00','2173-04-06 04:30:00','2173-04-06 08:00:00']
       })

我想创建另一个名为 tdiff 的列来计算时差

这是我试过的

df1['time_1'] = pd.to_datetime(df1['time_1'])
df['time_2'] = df['time_1'].shift(-1)
df['tdiff'] = (df['time_2'] - df['time_1']).dt.total_seconds() / 3600

但这会产生如下所示的输出。如您所见,它从下一个日期减去。相反,我想将时差限制在同一天。例如:如果 Jan 15th 20:00:00 PM 是当天的最后一条记录,那么我希望 tdiff4:00:00 (24:00:00: - 20:00:00)

我知道它正在发生,因为我正在改变时间值以减去,很明显突出显示的行正在从下一个日期开始选择记录。但是有没有办法避免这种情况而是计算同一天记录之间的时间差呢?

我希望我的输出是这样的。这里的 NaN 应该替换为当前日期 (23:59:00)。如果你检查差异,你就会有一个想法

是否有任何现有的方法或pandas功能可以帮助我们做到这一点datewise timedelta?如何按日期移动值?

IIUC,你可以使用:

s=pd.to_timedelta(24,unit='h')-(df1.time_1-df1.time_1.dt.normalize())
df1['tdiff']=df1.groupby(df1.time_1.dt.date).time_1.diff().shift(-1).fillna(s)
#df1.groupby(df1.time_1.dt.date).time_1.diff().shift(-1).fillna(s).dt.total_seconds()/3600

    subject_id              time_1    tdiff
0            1 2173-04-03 12:35:00 00:15:00
1            1 2173-04-03 12:50:00 00:09:00
2            1 2173-04-03 12:59:00 00:15:00
3            1 2173-04-03 13:14:00 00:23:00
4            1 2173-04-03 13:37:00 10:23:00
5            1 2173-04-04 11:30:00 12:30:00
6            1 2173-04-05 16:00:00 06:00:00
7            1 2173-04-05 22:00:00 02:00:00
8            1 2173-04-06 04:00:00 00:30:00
9            1 2173-04-06 04:30:00 03:30:00
10           1 2173-04-06 08:00:00 16:00:00

您可以使用 df.where and df.dt.ceil 来决定是从 time_2 中减去还是从 time_1 的午夜中减去:

sameDayOrMidnight = df.time_2.where(df.time_1.dt.date==df.time_2.dt.date, df.time_1.dt.ceil(freq='1d'))
df['tdiff'] = (sameDayOrMidnight - df.time_1).dt.total_seconds() / 3600

结果:

    subject_id              time_1              time_2      tdiff
0            1 2173-04-03 12:35:00 2173-04-03 12:50:00   0.250000
1            1 2173-04-03 12:50:00 2173-04-03 12:59:00   0.150000
2            1 2173-04-03 12:59:00 2173-04-03 13:14:00   0.250000
3            1 2173-04-03 13:14:00 2173-04-03 13:37:00   0.383333
4            1 2173-04-03 13:37:00 2173-04-04 11:30:00  10.383333
5            1 2173-04-04 11:30:00 2173-04-05 16:00:00  12.500000
6            1 2173-04-05 16:00:00 2173-04-05 22:00:00   6.000000
7            1 2173-04-05 22:00:00 2173-04-06 04:00:00   2.000000
8            1 2173-04-06 04:00:00 2173-04-06 04:30:00   0.500000
9            1 2173-04-06 04:30:00 2173-04-06 08:00:00   3.500000
10           1 2173-04-06 08:00:00                 NaT  16.000000