熊猫:如何加快导入和格式化日期?一种方法比另一种方法慢35倍

时间:2019-03-19 12:15:50

标签: python pandas datetime

我正在使用熊猫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)

0 个答案:

没有答案