Фрейм данных Python извлекает список уникальных дат из большого datetimeindex из нескольких миллионов строк

#python #pandas #dataframe #datetime #datetimeindex

#python #pandas #фрейм данных #datetime #datetimeindex

Вопрос:

В моем фрейме данных около 17 миллионов строк. Индекс равен DateTime. Это данные за год с разрешением около одной секунды. Теперь я хочу извлечь из него список уникальных дат.

Мой код:

 # sample df

df.index = DatetimeIndex(['2019-10-01 05:00:00', '2019-10-01 05:00:01',
               '2019-10-01 05:00:05', '2019-10-01 05:00:06',
               '2019-10-01 05:00:08', '2019-10-01 05:00:09',
               '2019-10-01 05:00:12', '2019-10-01 05:00:13',
               '2019-10-01 05:00:15', '2019-10-01 05:00:17',
               ...
               '2020-11-14 19:59:21', '2020-11-14 19:59:23',
               '2020-11-14 19:59:31', '2020-11-14 19:59:32',
               '2020-11-14 19:59:37', '2020-11-14 19:59:38',
               '2020-11-14 19:59:45', '2020-11-14 19:59:46',
               '2020-11-14 19:59:55', '2020-11-14 19:59:56'],
              dtype='datetime64[ns]', name='timestamp', length=17796121, freq=None)
dates = df.index.strftime('amp;Y-amp;m-%d').unique()
 

Мой приведенный выше код выдал результат. Но это заняло около пяти минут. Есть ли лучший способ, с помощью которого я могу получать даты намного быстрее?

Комментарии:

1. @Code Different Мне нужна помощь здесь. Я снова использую эти даты в цикле for. как for i in dates: auxdf = df.loc[i] и ранее dates , было в простой строке. Теперь, после вашего решения, оно находится в формате datetime. Как мне создать простые строки dates ?

Ответ №1:

Сохраните stftime , когда вам действительно нужны строки. Это довольно медленно.

Попробуйте это:

 dates = np.unique(dates.date)
 

Комментарии:

1. Результат был получен за 17 секунд. Сверхбыстрая. Просто удивительно. Огромное спасибо.

2. Мне нужна помощь здесь. Я снова использую эти даты в цикле for. как for i in dates: auxdf = df.loc[i] и ранее dates , было в простой строке. Теперь, после вашего решения, оно находится в формате datetime. Как мне создать простые строки dates ?

3. Избегайте циклов при работе с pandas / numpy. Используйте как можно больше векторизованного кода. Если вас интересует только «заставить это работать», попробуйте: date_str = pd.to_datetime(dates).strftime('%Y-%m-%d'); for i in date_str: ...

4. Это отлично. Время составляет 18 секунд. Он сверхбыстрый. Я думал, что извлечение строкового формата может занять несколько минут. Но нет. Еще раз спасибо. Я считаю себя все еще новичком. Я должен повторять каждый день и выполнять некоторые операции. Как вы думаете, возможна ли здесь векторизованная операция?

5. @Mainland, эти комментарии вызвали бы отличные вопросы!