#python #python-3.x #pandas #dataframe
#python #python-3.x #pandas #фрейм данных
Вопрос:
Я хотел бы получить количество столбцов по периоду времени в pandas dataframe.
моя таблица:
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 минут.
Спасибо
Ответ №1:
Сначала создайте столбец интервала и используйте 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
Ответ №2:
Первый агрегированный подсчет по 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
А затем измените формат datetimes на Series.dt.strftime
, с помощью next 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