我的问题与上一个问题有关。但是,情况有所不同。所以我创建了一个新帖子。
我想在熊猫数据框中的日期时间列中找到按“ id1”分组的10分钟持续时间。
我的桌子:
id1 date_time adress a_size
reom 2005-8-20 21:51:10 75157.5413 ceifwekd
reom 2005-8-20 22:51:10 3571.37946 ceifwekd
reom 2005-8-20 11:21:01 3571.37946 tnohcve
reom 2005-8-20 11:31:05 97439.219 tnohcve
penr 2005-8-20 17:07:16 97439.219 ceifwekd
penr 2005-8-20 19:10:37 7391.6258 ceifwekd
....
我需要
id1 date_time adress a_size 10mins_num_by_id1
reom 2005-8-20 21:51:10 75157.5413 ceifwekd 7
reom 2005-8-20 21:56:10 3571.37946 ceifwekd 7
reom 2005-8-20 22:21:01 3571.37946 tnohcve 7
reom 2005-8-20 22:51:11 97439.219 tnohcve 7
penr 2005-8-20 17:07:16 97439.219 ceifwekd 2
penr 2005-8-20 17:17:37 7391.6258 ceifwekd 2
....
对于
id1 date_time adress a_size 10mins_num_by_id1
reom 2005-8-20 21:51:10 75157.5413 ceifwekd 7
reom 2005-8-20 22:51:11 3571.37946 ceifwekd 7
我之所以得到7分,是因为从21:51:10到22:51:11,它有7个10分钟的时隙,按“ id1”分组
对于
id1 date_time adress a_size 10mins_num_by_id1
penr 2005-8-20 17:07:16 97439.219 ceifwekd 2
penr 2005-8-20 17:17:37 7391.6258 ceifwekd 2
我之所以得到2分,是因为从17:07:16到17:17:37有2个10分钟的时隙,按“ id1”分组。
我的代码:
df['10_min'] = df.groupby(['id1']).apply(lambda x: x['date_time'].dt.floor('10Min').count())
但是我为新专栏获得了NaN。
谢谢
答案 0 :(得分:1)
使用GroupBy.transform
来计算最大datetime
和最小10Min
之间的差异,然后使用Series.dt.ceil
并将timedelta转换为df['date_time'] = pd.to_datetime(df['date_time'])
df['new'] = (df.groupby('id1')['date_time']
.transform(lambda x: x.max() - x.min())
.dt.ceil('10Min')
.dt.total_seconds()
.div(600)
.astype(int))
print (df)
id1 date_time adress a_size new
0 reom 2005-08-20 21:51:10 75157.54130 ceifwekd 7
1 reom 2005-08-20 22:51:10 3571.37946 ceifwekd 7
2 reom 2005-08-20 22:21:01 3571.37946 tnohcve 7
3 reom 2005-08-20 22:51:11 97439.21900 tnohcve 7
4 penr 2005-08-20 17:07:16 97439.21900 ceifwekd 2
5 penr 2005-08-20 17:17:37 7391.62580 ceifwekd 2
s个时隙:
@Component({
...
)}
class MyComponent {
@HostListener('window:beforeunload')
logout() {
...
}
}
答案 1 :(得分:0)
我们可以将groupby
与transform
一起使用,得到max - min
,然后除以10分钟。最后,我们使用numpy.ceil
进行四舍五入:
df['10mins_num_by_id1'] = np.ceil(df.groupby(['id1'])['date_time']\
.transform(lambda x: x.max() - x.min()) / pd.Timedelta('10 minutes'))
print(df)
print(df)
id1 date_time adress a_size 10mins_num_by_id1
0 reom 2005-08-20 21:51:10 75157.54130 ceifwekd 7.0
1 reom 2005-08-20 22:56:10 3571.37946 ceifwekd 7.0
2 reom 2005-08-20 22:21:01 3571.37946 tnohcve 7.0
3 reom 2005-08-20 22:51:11 97439.21900 tnohcve 7.0
4 penr 2005-08-20 17:07:16 97439.21900 ceifwekd 2.0
5 penr 2005-08-20 17:17:37 7391.62580 ceifwekd 2.0