#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