Код, используемый для преобразования времени, занимает слишком много времени

#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 цикле.