посчитать столбец за период времени в панде - PullRequest
2 голосов
/ 23 апреля 2019

Я бы хотел получить количество столбцов за период времени в панде.

мой стол:

 id1       date_time               adress       a_size       
 reom      2005-8-20 22:51:10      75157.5413   ceifwekd
 reom      2005-8-20 22:55:25      3571.37946   ceifwekd
 reom      2005-8-20 11:21:01      3571.37946   tnohcve
 reom      2005-8-20 11:29:09      97439.219    tnohcve
 penr      2005-8-20 17:07:16     97439.219    ceifwekd
 penr      2005-8-20 19:10:37      7391.6258    ceifwekd
 ....

мне нужно:

id1      time_period                     num_of_address
reom     2005-8-20 22:50:00 - 23:00:00      2
reom     2005-8-20 11:20:00 - 11:30:00      2
penr     2005-8-20 17:00:00 - 17:10:00      1

Мой код: Я создал новый столбец, чтобы получить часы от date_time.

 df['num_per_10_minutes'] = df['id1'].map(df.groupby('id1', 'hours').apply(lambda x: x['date_time'].count()))

Но это не то, что я хочу. Мне нужно посчитать число «адрес» за 10 минут.

Спасибо

Ответы [ 2 ]

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

Сначала сделайте столбец интервала и используйте pandas.DataFrame.groupby:

import pandas as pd

df['date_time'] = pd.to_datetime(df['date_time'])
df = df.set_index('date_time', drop= True).sort_index()

df['intervals'] = ["%s - %s" % (i, i+1) 
                   for i in pd.date_range('2005-08-20', '2005-08-21', freq='10 min')
                   for d in df.index if i<= d <= (i+1)]
df.groupby(['id1', 'intervals'])['adress'].count().reset_index()

Выход:

    id1                                  intervals  adress
0  penr  2005-08-20 17:00:00 - 2005-08-20 17:10:00       1
1  penr  2005-08-20 19:10:00 - 2005-08-20 19:20:00       1
2  reom  2005-08-20 11:20:00 - 2005-08-20 11:30:00       2
3  reom  2005-08-20 22:50:00 - 2005-08-20 23:00:00       2
1 голос
/ 23 апреля 2019

Первый совокупный счет на GroupBy.size с Series.dt.floor:

df['date_time'] = pd.to_datetime(df['date_time'])

df = df.groupby(['id1', df['date_time'].dt.floor('10Min')]).size().reset_index(name='adress')
print (df)
    id1           date_time  adress
0  penr 2005-08-20 17:00:00       1
1  penr 2005-08-20 19:10:00       1
2  reom 2005-08-20 11:20:00       2
3  reom 2005-08-20 22:50:00       2

А затем измените формат даты и времени на Series.dt.strftime, со следующими 10 Min:

df['date_time'] = (df['date_time'].dt.strftime('%Y-%m-%d %H:%M:%S') + 
                   (df['date_time'] + pd.Timedelta(10, unit='min')).dt.strftime(' - %H:%M:%S'))
print (df)
    id1                       date_time  adress
0  penr  2005-08-20 17:00:00 - 17:10:00       1
1  penr  2005-08-20 19:10:00 - 19:20:00       1
2  reom  2005-08-20 11:20:00 - 11:30:00       2
3  reom  2005-08-20 22:50:00 - 23:00:00       2

df['date_time'] = (df['date_time'].dt.strftime('%Y-%m-%d %H:%M:%S') + 
                   (df['date_time'] + pd.Timedelta(10, unit='min')).
                     dt.strftime(' - %Y-%m-%d %H:%M:%S'))
print (df)
    id1                                  date_time  adress
0  penr  2005-08-20 17:00:00 - 2005-08-20 17:10:00       1
1  penr  2005-08-20 19:10:00 - 2005-08-20 19:20:00       1
2  reom  2005-08-20 11:20:00 - 2005-08-20 11:30:00       2
3  reom  2005-08-20 22:50:00 - 2005-08-20 23:00:00       2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...