#python #pandas #datetime
Вопрос:
У меня есть фрейм данных следующим образом (воспроизводимые данные):
np.random.seed(365) rows = 17000 data = np.random.uniform(20.25, 23.625, size=(rows, 1)) df = pd.DataFrame(data , columns=['Ta']) 'Set index' Epoch_Start=1636757999 Epoch_End=1636844395 time = np.arange(Epoch_Start,Epoch_End,5) df['Epoch']=pd.DataFrame(time) df.reset_index(drop=True, inplace=True) df=df.set_index('Epoch') Epoch Ta 1636757999 23.427413 1636758004 22.415409 1636758009 22.560560 1636758014 22.236397 1636758019 22.085619 ... 1636842974 21.342487 1636842979 20.863043 1636842984 22.582027 1636842989 20.756926 1636842994 21.255536 [17000 rows x 1 columns]
Мой ожидаемый результат таков: 1.- Столбец с датой преобразования из времени эпохи в время даты (столбец «даты» в возвращаемом значении функции). (пример: 2021-11-12 22:59:59)
Вот код, который я использую:
def obt_dat(path): df2=df df2['date'] = df.index.values df2['date'] = pd.to_datetime(df2['date'],unit='s') df2['hour']='' df2['fecha']='' df2['dates']='' start = time.time() for i in range(0,len(df2)): df2['hour'].iloc[i]=df2['date'].iloc[i].hour df2['fecha'].iloc[i]=str(df2['date'].iloc[i].year) str(df2['date'].iloc[i].month) str(df2['date'].iloc[i].day) df2['dates'] = df2['fecha'].astype(str) df2['hour'].astype(str) end = time.time() T=round((end-start)/60,2) print('Tiempo de Ejecución Total: ' str(T) ' minutos') return(df2) obt_dat(df)
После этого я использую .groupby
, чтобы получить средние значения за определенные часы. Но проблема в том, что выполнение кода занимает много времени. Может ли у кого-нибудь быть идея сократить время выполнения функции obt_dat()
Ответ №1:
Вы можете использовать dt
(методы доступа к дате) для устранения циклов:
df2 = df.copy() df2['date'] = df.index.values df2['date'] = pd.to_datetime(df2['date'], unit='s') df2['hour'] = df2['date'].dt.hour df2['fecha'] = df2['date'].dt.strftime('%Y%m%d') df2['dates'] = df2['date'].dt.strftime('%Y%m%d%H')
Время с вашим воспроизводимым примером дает:
156 ms ± 1.22 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Комментарии:
1. Спасибо! у меня были проблемы с расширением «dt». я не мог назвать это правильным.
Ответ №2:
Используйте простые Python — списки или диктанты вместо фреймов данных.
Если вам действительно нужен фрейм данных, создайте его в конце операций, требующих больших ресурсов процессора.
Но это всего лишь мое предположение — возможно, вам захочется провести сравнительный анализ, чтобы увидеть, сколько времени на самом деле занимает каждая часть кода. «Очень долго» относительно, но я почти уверен, что вашим узким местом являются операции с кадрами данных, которые вы выполняете в for
цикле.