【问题标题】:Converting string to Date time - performance issues将字符串转换为日期时间 - 性能问题
【发布时间】:2020-06-05 16:31:23
【问题描述】:

我目前正在处理大文件,每个文件包含 6500 万行(大小约为 2.5 GB),我需要将其中一列转换为 DateTime(日期格式为 2019-12-03 08:04:00.200

我已经尝试了 3 种方法。

  1. 将文件作为数据帧读取,然后使用 pd.to_datetime()
  2. 将文件作为数据帧读取 - 然后使用.apply(lambda x : datetime.strptime(x,'%d/%m/%Y %H:%M:%S.%f')
  3. 在将文件作为数据帧读取时使用日期解析器转换列

第 3 个选项是最快的(然后是第二个,最后是第一个)。 但每个文件都需要超过 25 分钟。

有更快的选择吗?

【问题讨论】:

    标签: pandas performance datetime strptime


    【解决方案1】:

    我建议你使用stick with pd.to_datetime

    我尝试了所有常用的方法来加快速度,例如使用 numpynumba,但速度并不快。

    速度测试

    首先让我们创建数据来测试它:

    import pandas as pd
    import numpy as np
    from datetime import datetime
    
    size = 100_000
    
    data = {
        "year": np.random.choice([str(x) for x in range(2000, 2020)], size),
        "month": np.random.choice([str(x).zfill(2) for x in range(1, 12)], size),
        "day": np.random.choice([str(x).zfill(2) for x in range(1, 28)], size),
        "hour": np.random.choice([str(x).zfill(2) for x in range(24)], size),
        "minute": np.random.choice([str(x).zfill(2) for x in range(60)], size),
        "second": np.random.choice([str(x).zfill(2) for x in range(60)], size),
        "cent": np.random.choice([str(x).zfill(2) for x in range(100)], size),
    }
    
    df = pd.DataFrame(data.values(), index=data.keys()).T
    

    然后是date 列:

    df["date"] = (
        df["year"] + "-" +
        df["month"] + "-" +
        df["day"] + " " +
        df["hour"] + ":" +
        df["minute"] + ":" +
        df["second"] + "." +
        df["cent"]
    )
    

    对于 numba 测试:

    from numba import jit
    
    @jit
    def cast_numba(x):
        return x.astype(np.datetime64)
    

    现在我们可以测试所有这些:

    %timeit pd.to_datetime(df["date"])
    1.07 s ± 71 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    %timeit df["date"].values.astype(np.datetime64)
    2.04 s ± 73.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    %timeit cast_numba(df["date"].values)
    2.24 s ± 394 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    %timeit df["date"].apply(lambda x : datetime.strptime(x,'%Y-%m-%d %H:%M:%S.%f'))
    23 s ± 1.38 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-13
      • 2014-09-21
      • 1970-01-01
      • 2017-03-15
      • 2015-09-17
      • 1970-01-01
      • 2022-08-18
      相关资源
      最近更新 更多