我的数据集是这样的:
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
- 为了按升序对时间戳进行排序,请执行以下操作:
#Let's say the dataframe is df
df['time_stamp'] = pd.to_datetime(df['time_stamp'])
df.sort_values(by='time_stamp')
- 对于工作日,我会这样做:
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)