[英]Code using to convert time is taking too long
我有一个 dataframe 如下(可重现的数据):
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]
我预计 output 是: 1.- 日期从 Epochtime 转换为 Datetime 的列(函数返回值中的列“日期”)。 (例: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
从特定时间获取平均值。 但是,问题是代码需要很长时间才能执行。 谁能想到缩短 function obt_dat()
的运行时间
使用普通的 Python - 列表或字典而不是数据帧。
如果您确实需要 dataframe,请在 CPU 密集型操作结束时构建它。
但这只是我的假设——你可能想做一些基准测试来看看代码的每个部分真正需要多少时间。 “很长”是相对的,但我很确定您的瓶颈是您在for
循环中执行的 dataframe 操作。
您可以使用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.