代码之家  ›  专栏  ›  技术社区  ›  Maxime

慢速pd.to\u datetime()

  •  1
  • Maxime  · 技术社区  · 6 年前

    我正在阅读两种非常相似的csv文件。 它们的长度差不多,有两万行。每行表示每秒记录的参数。 因此,第一列是时间戳。

    • 在第一个文件中,模式如下:2018-09-24 15:38

    在这两种情况下,命令是相同的:

    data = pd.read_csv(file)
    data['Timestamp'] = pd.to_datetime(data['Timestamp'])
    

    我检查两行的执行时间:

    • pd.read在这两种情况下都同样有效

    唯一的区别是日期模式。我不会怀疑的。你知道为什么吗?你知道怎么修吗?

    1 回复  |  直到 6 年前
        1
  •  8
  •   ALollz    4 年前

    pandas.to_datetime 当它需要自动解析日期时,速度非常慢(在某些情况下)。既然您似乎知道这些格式,就应该显式地将它们传递给 format

    举个例子:

    import pandas as pd
    df1 = pd.DataFrame({'Timestamp': ['2018-09-24 15:38:06']*10**5})
    df2 = pd.DataFrame({'Timestamp': ['2018-09-24 03:38:06 PM']*10**5})
    
    %timeit pd.to_datetime(df1.Timestamp)
    #21 ms ± 50.4 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    %timeit pd.to_datetime(df2.Timestamp)
    #14.3 s ± 122 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    慢了700倍。现在明确指定格式:

    %timeit pd.to_datetime(df2.Timestamp, format='%Y-%m-%d %I:%M:%S %p')
    #384 ms ± 1.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    pandas


    编辑:截止 pd.__version__ == '1.0.5' 对于以前解析速度非常慢的格式,自动解析似乎变得更好了,这可能是由于 this performance improvement pd.__version == '0.25.0'

    import pandas as pd
    df1 = pd.DataFrame({'Timestamp': ['2018-09-24 15:38:06']*10**5})
    df2 = pd.DataFrame({'Timestamp': ['2018-09-24 03:38:06 PM']*10**5})
    
    %timeit pd.to_datetime(df1.Timestamp)
    #9.01 ms ± 294 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    %timeit pd.to_datetime(df2.Timestamp)
    #9.1 ms ± 267 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)