Подсчет строк, перекрывающих временной интервал - PullRequest
0 голосов
/ 13 февраля 2019

Это моя проблема: у меня есть DataFrame esp (около 5 миллионов строк), состоящий из трех столбцов, даты начала и времени, даты окончания и категории

    DHE                 DHS                 CAT  
0   2017-01-08 13:28:20 2017-01-08 13:43:13 43  
1   2017-01-08 13:43:50 2017-01-08 13:45:39 43  
2   2017-01-08 13:43:57 2017-01-08 13:46:18 43  
3   2017-01-08 13:44:03 2017-01-08 13:46:32 43  
4   2017-01-08 13:44:24 2017-01-08 13:53:29 43  
DHE    datetime64[ns]
DHS    datetime64[ns]
CAT             int64
dtype: object

У меня есть второй объект DataFrame ts (около 1 миллиона)строк), состоящий из одноминутных временных интервалов и столбца для каждой категории

ts = pd.DataFrame(data={str(i): 0 for i in np.sort(esp['CAT'].unique())},
              index = pd.date_range(min(min(esp['DHE']), min(esp['DHS'])), 
                                     (max(max(esp['DHE']), max(esp['DHS'])) + pd.Timedelta(days=1)), 
                                     freq='min', 
                                     normalize=True))

                    41  42  43  45  46  47  48  50  52  53  54  55
2016-01-10 00:00:00 0   0   0   0   0   0   0   0   0   0   0   0
2016-01-10 00:01:00 0   0   0   0   0   0   0   0   0   0   0   0
2016-01-10 00:02:00 0   0   0   0   0   0   0   0   0   0   0   0
2016-01-10 00:03:00 0   0   0   0   0   0   0   0   0   0   0   0
2016-01-10 00:04:00 0   0   0   0   0   0   0   0   0   0   0   0
dtype('<M8[ns]')
41    int64
42    int64
43    int64
45    int64
46    int64
47    int64
48    int64
50    int64
52    int64
53    int64
54    int64
55    int64
dtype: object

Я хотел бы иметь во втором таймфрейме количество отсчетов для всех временных интервалов по категории количества событийesp, который начался, но еще не закончился.
Поэтому я делаю следующее:

for index, row in esp.iterrows():
    ts.loc[row['DHE'].floor('min'):row['DHS'].ceil('min'), str(row['CAT'])] += 1

Однако, это очень долго, потому что я не нашел решения, которое обходило бы использование дляпетля.Не могли бы вы помочь мне найти способ получения желаемого результата, который был бы быстрее (например, используя возможности векторизации numpy?)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...