найти количество временных интервалов в столбце datetime в фрейме данных pandas

#python #python-3.x #pandas #datetime #dataframe

#python #python-3.x #pandas #datetime #фрейм данных

Вопрос:

Мой вопрос относится к моему предыдущему вопросу. Но это другое.Итак, я создал новый пост.

Я хотел бы узнать, сколько 10 минут продолжительности сгруппировано по «id1» в столбце datetime в фрейме данных pandas.

моя таблица:

  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 для нового столбца.

Спасибо

Ответ №1:

Используйте GroupBy.transform для определения разницы между максимальными и минимальными datetime секундами, затем используйте Series.dt.ceil и преобразуйте временные интервалы в 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
  

Ответ №2:

Мы можем использовать groupby with transform и get 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