繁体   English   中英

在 Pandas 数据框中的日期时间列中查找时隙数

[英]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

我们可以将groupbytransform使用并获得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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM