根据时间戳分隔行
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')
- 为了按升序对时间戳进行排序,请执行以下操作:
#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)
一个简单的方法是减去 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
我的数据集如下所示:
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')
- 为了按升序对时间戳进行排序,请执行以下操作:
#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)
一个简单的方法是减去 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