[英]find number of time slots in a datetime column in pandas dataframe
我的问题与我之前的问题有关。 但是,它是不同的。所以我创建了一个新帖子。
我想在 pandas 数据帧的日期时间列中找到按“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 个按“id1”分组的 10 分钟时间段
为了
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。
谢谢
使用GroupBy.transform
获取最大和最小datetime
s 之间的差异,然后使用Series.dt.ceil
并将 timedeltas 转换为10Min
s 时隙:
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
我们可以将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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.