Ищете способ группировки по datetime, если datetime между двумя датами, используя Pandas из Python - PullRequest
2 голосов
/ 18 июня 2020

Я пытаюсь сделать следующее, используя Pandas (Python).

У меня есть фрейм данных со следующими столбцами:

Building, Door_Color, Door_Time_Open, Door_Time_Close, Opening_Width

Я пытаюсь сгруппировать данные по дате и времени таким образом, чтобы каждую секунду я подсчитывал количество открытых дверей и сумму width_of_opening.

например:

Data:
Building, Door_Color, Door_Time_Open, Door_Time_Close, Opening_Width
A , Red , 2000-01-01 00:00:00, 2000-01-01 00:00:05, 10
A , Red , 2000-01-01 00:00:02, 2000-01-01 00:00:04, 5

Result:
Date, Building, Door_Color, Door_Count, Sum_Opening_Width
2000-01-01 00:00:00, A, Red, 1 , 10
2000-01-01 00:00:01, A, Red, 1 , 10
2000-01-01 00:00:02, A, Red, 2 , 15
2000-01-01 00:00:03, A, Red, 2 , 15
2000-01-01 00:00:04, A, Red, 2 , 15
2000-01-01 00:00:05, A, Red, 1 , 10
2000-01-01 00:00:06, A, Red, 0 , 0

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

Любая помощь будет принята с благодарностью!

edit1: данные немного большие, около 6 миллионов строк.

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Обработка времени каждой строки, а затем группы

def news(r):
    df1 = pd.DataFrame()
    df1['Date'] = pd.date_range(r['Door_Time_Open'],r['Door_Time_Close'],freq='s')
    for idx in ['Building','Door_Color','Opening_Width']:
        df1[idx] = r[idx]
    return df1

df['Door_Time_Open'] = pd.to_datetime(df['Door_Time_Open'])
df['Door_Time_Close'] = pd.to_datetime(df['Door_Time_Close'])
df_list = []
for idx,row in df.iterrows():
    df_list.append(news(row))
data = pd.concat(df_list).groupby(['Date','Building','Door_Color'])['Opening_Width'].agg(['count','sum'])
print(data)
0 голосов
/ 18 июня 2020

Если данные не слишком большие (за длительный период времени), вы можете выполнить перекрестное слияние:

times = pd.DataFrame({'Date':pd.date_range(df['Door_Time_Open'].min(), 
                                           df['Door_Time_Close'].max(), freq='s'),
                      'dummy':1
                     })


(df.assign(dummy=1)
   .merge(times, on='dummy')
   .query('Door_Time_Open<=Date<=Door_Time_Close')
   .groupby(['Date','Building','Door_Color'])
   ['Opening_Width'].agg(['count','sum'])
   .reset_index()
)

Вывод:

                 Date Building Door_Color  count  sum
0 2000-01-01 00:00:00       A        Red       1   10
1 2000-01-01 00:00:01       A        Red       1   10
2 2000-01-01 00:00:02       A        Red       2   15
3 2000-01-01 00:00:03       A        Red       2   15
4 2000-01-01 00:00:04       A        Red       2   15
5 2000-01-01 00:00:05       A        Red       1   10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...