在熊猫数据框中的日期时间列中找到时隙数

时间:2019-04-23 12:09:37

标签: python python-3.x pandas datetime dataframe

我的问题与上一个问题有关。但是,情况有所不同。所以我创建了一个新帖子。

我想在熊猫数据框中的日期时间列中找到按“ 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。

谢谢

2 个答案:

答案 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)

我们可以将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