根据时间戳分隔行

separate rows based on timestamps

我的数据集如下所示:

      main_id            time_stamp                        
          aaa            2019-05-29 08:16:05+05     
          aaa            2019-05-30 00:11:05+05     
          aaa            2020-05-30 09:15:07+05     
          bbb            2019-05-29 09:11:05+05     

对于每个 main_id,我想:

a) 将time_stamps按升序排列

b) 我想创建一个新列 day,它使用 time_stamp 派生一个描述工作日的数字。

工作日定义如下:

星期一 05:00 - 星期二 01:00(1 个工作日,即星期一)

星期二 05:00 - 星期三 01:00 =>(1 个工作日,即星期二)

等等...

带有 main_id = aaa 的第一行和第二行来自同一工作日,因为第二行显示的是第二天凌晨 1 点之前的时间。所以,这是第一个工作日,day 列将有 1.

但是,在第三行中,时间戳来自另一个工作日,因此我们添加 2 作为 day

最终结果可能如下所示:

      main_id        time_stamp                             day
          aaa            2019-05-29 08:16:05+05              1
          aaa            2019-05-30 00:11:05+05              1
          aaa            2020-05-30 09:15:07+05              2
          bbb            2019-05-29 09:11:05+05              1

第 1 天将是第一个 5:00 上午到第二天凌晨 1 点之间的任何时间。而第 2 天将是下一个可能的工作日(接下来的凌晨 5 点 - 凌晨 1 点)

我怎样才能做到这一点?

df = df.sort_values('vehicle_id')
  1. 为了按升序对时间戳进行排序,请执行以下操作:
#Let's say the dataframe is df
df['time_stamp'] = pd.to_datetime(df['time_stamp'])
df.sort_values(by='time_stamp')
  1. 对于第一个工作日,我会这样做:
day1= #add the end of the first businesss date, like:  2019-05-30 01:00
df['day']=1
for i in df.index:
    df['day'].iloc[i]+=ceil(df['day'].iloc[i] - day1)

一个简单的方法是减去 5 小时,然后按排序的日期分组以获得组号:

df['time_stamp'] = pd.to_datetime(df['time_stamp'])
s = df['time_stamp'].sub(pd.Timedelta('5h'))
df['day'] = df.groupby(s.dt.date).ngroup().add(1)

注意。您实际上不需要对值进行排序,groupby 默认对值进行排序。

根据“main_id”应用的变体:

df['day'] = (df.groupby('main_id')
               .apply(lambda d: d.groupby(s.dt.date).ngroup().add(1)).droplevel(0)
            )

输出:

  main_id                time_stamp  day
0     aaa 2019-05-29 08:16:05+05:00    1
1     aaa 2019-05-30 00:11:05+05:00    1
2     aaa 2020-05-30 09:15:07+05:00    2
3     bbb 2019-05-29 09:11:05+05:00    1