найти количество временных интервалов в столбце datetime в панде - PullRequest
2 голосов
/ 23 апреля 2019

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

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

моя таблица:

 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 ]

1 голос
/ 23 апреля 2019

Используйте GroupBy.transform для разницы между максимальным и минимальным datetime с, затем используйте Series.dt.ceil и конвертируйте временные интервалы в 10Min с временными интервалами:

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
0 голосов
/ 23 апреля 2019

Мы можем использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...