У меня есть большой фрейм данных Pandas, в котором один столбец (неупорядоченный) представляет собой дату и время из известного периода (2013 год). Мне нужен эффективный способ преобразовать эти даты в индексы, , где каждый индекс = # часов с момента start_time ('2013-1-1 00)'. Там - это повторяющиеся времена , который должен отображаться на повторяющиеся индексы.

Очевидно, это можно делать по очереди с помощью цикла, используя timedelta. Это также можно сделать с помощью цикла, используя Pandas Series (см. Следующий фрагмент, который генерирует упорядоченную серию всех значений времени с момента start_time):

nhours = 365*24
time_series = Series(range(nhours), index=pd.date_range('2013-1-1', periods=nhours, freq='H'))

После запуска этого фрагмента можно получить индексы, используя методы .index или .get_loc в цикле.

** Однако есть ли быстрый (без зацикливания?) Способ взять столбец с произвольными датами и найти их соответствующие индексы? **

Например, ввод следующего столбца даты и времени:

2013-01-01 11: 00: 00
2013-01-01 11: 00: 00
2013-01-01 00:00:00
2013-12-30 18:00:00

должен выводить следующие индексы: [11, 11, 0, 8730]

Ответы (3)

loc может принимать список или массив меток для поиска:

>>> print time_series.loc[[pd.Timestamp('20130101 11:00'), pd.Timestamp('20130101 11:00'), pd.Timestamp('20130101'), pd.Timestamp('20131230 18:00')]]
2013-01-01 11:00:00      11
2013-01-01 11:00:00      11
2013-01-01 00:00:00       0
2013-12-30 18:00:00    8730
dtype: int64

Используйте isin:

time_series[time_series.index.isin(['2013-01-01 11:00:00',
                                    '2013-01-01 00:00:00',
                                    '2013-12-30 18:00:00'])].values

# Returns: array([   0,   11, 8730])

между и between_time также полезны

Спасибо за ответы. У меня есть новое, более быстрое решение, которое использует тот факт, что pandas поддерживает форматы datetime и timedelta. Оказывается, следующее примерно в два раза быстрее, чем решение Колина выше (хотя и не так гибко), и оно позволяет избежать накладных расходов на создание Серии упорядоченных дат времени:

all_indices = (df['mydatetimes'] - datetime(2013,1,1,0)) / np.timedelta64(1,'h') 

, где df - это фрейм данных pandas, а mydatetimes - имя столбца, которое включает дату и время.

Время выполнения кода дает, что это решение выполняет 30 000 индексов в:

0: 00: 00.009909 -> этот фрагмент

0: 00: 00.017800 -> Решение Колина с ts = Series (...) и ts.loc. Я исключил единовременные накладные расходы на построение серии из этого времени

2022 WebDevInsider