【发布时间】:2014-09-01 08:03:39
【问题描述】:
我正在从 csv 加载数据帧,然后执行以下操作。加载数据帧大约需要 2 秒。其他操作(主要是日期转换)需要 30 秒。有没有办法加快其他操作?
df = pd.DataFrame.from_csv( fn, index_col=None )
df['SCHEDULED_OFF'] = pd.to_datetime( df['SCHEDULED_OFF'], format='%d-%m-%Y %H:%M' )
df['LATEST_TAKEN'] = pd.to_datetime( df['LATEST_TAKEN'], format='%d-%m-%Y %H:%M:%S' )
df['FIRST_TAKEN'] = pd.to_datetime( df['FIRST_TAKEN'], format='%d-%m-%Y %H:%M:%S' )
df['SETTLED_DATE'] = pd.to_datetime( df['SETTLED_DATE'], format='%d-%m-%Y %H:%M:%S' )
df['ACTUAL_OFF'] = pd.to_datetime( df['ACTUAL_OFF'], format='%d-%m-%Y %H:%M:%S' )
df['ACTUAL_OFF'] = df['ACTUAL_OFF'].fillna( pd.datetime.min )
df[ 'LATEST_TAKEN_FROM_SCHEDULED_OFF' ] = ( df['SCHEDULED_OFF'].values -df['LATEST_TAKEN'].values ) / np.timedelta64( 1, 's' )
df[ 'FIRST_TAKEN_FROM_SCHEDULED_OFF' ] = ( df['SCHEDULED_OFF'].values -df['FIRST_TAKEN'].values ) / np.timedelta64( 1, 's' )
df[ 'IN_PLAY' ] = [ dicInPlay[ x ] for x in df[ 'IN_PLAY' ] ]
df['COUNTRY'] = df['COUNTRY'].fillna( '' )
df['FULL_DESCRIPTION'] = df['FULL_DESCRIPTION'].fillna( '' )
df['EVENT'] = df['EVENT'].fillna( '' )
df['COURSE'] = df['COURSE'].fillna( '' )
【问题讨论】:
-
您是否尝试过告诉 csv 解析器哪些列是日期列,然后像这样创建 df?
df = pd.read_csv( csv_path, parse_dates=['SCHEDULED_OFF','LATEST_TAKEN','FIRST_TAKEN','SETTLED_DATE','ACTUAL_OFF'])我觉得应该可以 -
我刚刚敲了一个虚拟 csv,它可以毫无问题地处理所有不同的日期格式,所以试试我的建议
-
感谢您的建议。刚试了一下,好像比原来的方法慢很多。;{
-
更慢的是,您声称日期转换例程是最慢的部分,通过预先告诉 csv 解析器哪些列是日期以便解析它们,这应该更快
-
@EdChum 这不一定慢:
read_csv中的parse_dates功能在许多情况下只是在后台使用to_datetime。速度将取决于日期格式。在这种情况下,需要dayfirst=True,这比在to_datetime中提供格式要慢得多。
标签: python numpy pandas anaconda