#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, эти комментарии вызвали бы отличные вопросы!