【问题标题】:How to restrict time difference to same day?如何将时差限制在同一天?
【发布时间】:2020-01-02 10:11:22
【问题描述】:

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

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?如何按日期移动值?

【问题讨论】:

  • 有点不清楚你想要什么。你能告诉我们预期的输出吗?
  • 下面给出的两个答案都非常好。我只能将一个答案标记为解决方案,所以我选择@anky_91 答案。尽管如此,SpghttCd 的答案也很高兴知道并解决了问题。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以使用df.wheredf.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
    

    【讨论】:

      猜你喜欢
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      相关资源
      最近更新 更多