我正在使用熊猫0.24.2
我注意到,在某些情况下,Pandas非常小,导入和格式化日期的速度非常慢。加快过程的最佳方法是什么?
让我详细说明-并分享我到目前为止所发现的内容。
下面的脚本创建了一个带有2个日期列的CSV文件,故意创建该日期为<= 12的日期,即无法推断正确的格式(是1月1日1-2日还是2月2日?)。
我发现使用dayfirst选项的速度非常慢;不论日期是直接导入(请参阅下面的parse1)还是以字符串形式导入,然后用pd.to_datetime转换(请参见下面的parse2),速度(慢度)都相同。
我发现最快的方法是导入为字符串,然后通过显式指定格式进行转换(请参阅解析3)。有没有更好的方法来加快这一过程?
也:
在我的计算机上,此方法(parse3)的速度比以前快35(sic!)倍 parse1和parse2!这怎么可能?如何将其标记为/ 与熊猫开发团队讨论过?许多月前,我在奔腾486上获得了更快的速度!熊猫的编码方式非常非常错误!
如果熊猫需要25分钟才能如何声称它是一种数据科学工具 秒导入具有100k条记录的2列日期?
PS我尝试使用%e数天而没有尝试零,但是它没有用。但是,该功能在date1上也能正常工作,即使它可能期望尾随零。
import numpy as np
import pandas as pd
import time
import timeit
start_time=time.time()
n=int(100e3)
out =pd.DataFrame()
out['day']=np.random.randint(1,12,n)
out['month']=np.random.randint(1,12,n)
out['year']=np.random.randint(2000,2010,n)
out['date1']= out.day.astype(str) + '-' + out.month.astype(str) + '-' + out.year.astype(str)
out['date2']= out['day'].map('{:0>2d}'.format ) + '-' + out['month'].map('{:0>2d}'.format ) + '-' + out.year.astype(str)
out.to_csv('test dates.csv')
print('Exported in ')
print(time.time()-start_time)
def noparse():
return pd.read_csv('test dates.csv', dtype={'date1':str,'date2':str} )
def parse1():
return pd.read_csv('test dates.csv', parse_dates=['date1','date2'], dayfirst=True )
def parse2():
df = pd.read_csv('test dates.csv', dtype={'date1':str,'date2':str} )
for d in ['date1','date2']:
df[d]= pd.to_datetime( df[d], dayfirst=True )
return df
def parse3():
df = pd.read_csv('test dates.csv', dtype={'date1':str,'date2':str} )
# formatting described at: http://php.net/manual/en/function.strftime.php
df['date1']=pd.to_datetime(df['date1'], format='%d-%m-%Y')
df['date2']=pd.to_datetime(df['date2'], format='%d-%m-%Y')
return df
results=pd.DataFrame()
results['no parse'] = timeit.Timer( "noparse()", globals=globals() ).repeat(repeat=3, number =1)
results['parse 1']=timeit.Timer( "parse1()", globals=globals() ).repeat(repeat=3, number =1)
results['parse 2']=timeit.Timer( "parse2()", globals=globals() ).repeat(repeat=3, number =1)
results['parse 3']=timeit.Timer( "parse3()", globals=globals() ).repeat(repeat=3, number =1)