Pandas to_datetime()函数性能问题

时间:2017-02-10 16:21:38

标签: python pandas

有这样的df:

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

列'Dat'具有对象类型,所以我尝试使用to_datetime()pandas函数将其切换到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()函数是否能够通过循环进行转换,或者通过循环迭代进行转换。

感谢。

5 个答案:

答案 0 :(得分:3)

如果考虑到性能,我建议使用以下函数将这些列转换为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

答案 1 :(得分: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

有块后,可以分别在每个块上应用datetime函数。

答案 2 :(得分:1)

更新:此增强功能已合并到pandas 0.23.0

  

缓存布尔值, 默认为False

     

如果为True,则使用唯一的转换日期缓存来应用datetime   转换。解析重复项时可能会大大提高速度   日期字符串,特别是带有时区偏移的日期字符串。

答案 3 :(得分: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倍。

答案 4 :(得分:0)

从之前的答案中得到启发,在同时存在性能问题和多种日期格式的情况下,我建议采用以下解决方案。

@Repository
public interface KlienciRepository extends JpaRepository<Klienci, Integer> {


@Query(SELECT * from klienci k where k.imieKlienta like "?1%")

List<klienci> findbyfirstname(String firstname);

}