2017-02-10 53 views
2

有一个这样的DF:熊猫to_datetime()函数的性能问题

Dat 
10/01/2016 
11/01/2014 
12/02/2013 

列“逸”有对象类型,所以我尝试使用to_datetime()熊猫将其切换到日期时间函数的方式:

to_datetime_rand = partial(pd.to_datetime, format='%m/%d/%Y') 
df['DAT'] = df['DAT'].apply(to_datetime_rand) 

一切正常,但我有性能问题,当我的DF高于20亿行。所以在这种情况下,这种方法可能会陷入困境,并且效果不佳。

pandas to_datetime()函数是否可以通过chunck进行转换,也可以通过循环进行迭代转换。

谢谢。

+2

日期是唯一的吗?如果没有,你可以使用一个字典存储新的日期时间值和字符串,所以它不需要转换,如果它看到日期之前,另外任何原因,你不能只是'df ['DAT'] = pd.to_datetime (df ['DAT'],format ='%m /%d /%Y')'? – EdChum

+1

绝对不要使用'.apply' –

回答

2

如果性能是一个问题我会建议使用下面的函数来这些列转换为date_time

def lookup(s): 
    """ 
    This is an extremely fast approach to datetime parsing. 
    For large data, the same dates are often repeated. Rather than 
    re-parse these, we store all unique dates, parse them, and 
    use a lookup to convert all dates. 
    """ 
    dates = {date:pd.to_datetime(date) for date in s.unique()} 
    return s.apply(lambda v: dates[v]) 
to_datetime: 5799 ms 
dateutil: 5162 ms 
strptime: 1651 ms 
manual:  242 ms 
lookup:  32 ms 
+0

嘿,这是我第二次看到你非常聪明的答案。我想知道是否用另一种使用分类的算法对相同的优化概念进行了测试。我正在考虑将列转换为明确的标签,并将其转换为日期(请参阅http://pandas.pydata.org/pandas-docs/stable/categorical.html#string-and-datetime-accessors)。如果您有机会对其进行测试并与当前的以上基准进行比较,请告诉我们。谢谢! – Boud

+0

本周末我会看看这个周末,星期二回来看看,我会添加一个修改。如果您有任何特别的注意事项,可能会发布一个问题,我会将其添加为书签,并旨在正确回答。 – SerialDev

+2

这个确切的问题已经打开了一段时间,实现非常简单:https://github.com/pandas-dev/pandas/issues/11665如果有人感兴趣 – Jeff

2

你可以分割成块的庞大数据帧分成较小的,例如这种方法可以做到这一点,你可以决定什么是块大小:

def splitDataFrameIntoSmaller(df, chunkSize = 10000): 
    listOfDf = list() 
    numberChunks = len(df) // chunkSize + 1 
    for i in range(numberChunks): 
     listOfDf.append(df[i*chunkSize:(i+1)*chunkSize]) 
    return listOfDf 

有了块以后,可以分别在每个块上应用日期时间函数。

0

我刚刚遇到同样的问题。感谢SerialDev的出色答案。要建立对,我尝试使用datetime.strptime代替pd.to_datetime的:

from datetime import datetime as dt 

dates = {date : dt.strptime(date, '%m/%d/%Y') for date in df['DAT'].unique()} 
df['DAT'] = df['DAT'].apply(lambda v: dates[v]) 

的strptime方法比对我来说是to_datetime方法快6.5倍。