基于时间戳分隔行



我的数据集是这样的:

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

第一天是在第一个早上5点到第二天凌晨1点之间的任何地方。而第二天将是下一个可能的工作日(从早上5点到凌晨1点)

我怎样才能做到这一点?

df = df.sort_values('vehicle_id')

一个简单的方法是减去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)

NB。您实际上不需要对值进行排序,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
  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)

最新更新