【问题标题】:How to convert unix epoch time to datetime with timezone in pandas如何在熊猫中使用时区将unix纪元时间转换为日期时间
【发布时间】:2021-05-02 23:48:20
【问题描述】:

我有许多包含 Unix 纪元时间的 csv 文件,这些文件需要转换为人类可读的日期/时间。下面的 Python 代码可以完成这项工作,但速度很慢。

df['dt'] = pd.to_datetime(df['epoch'], unit='s')
df['dt'] = df.apply(lambda x: x['dt'].tz_localize('UTC').tz_convert('Europe/Amsterdam'), axis=1)

实际上,第二行是瓶颈(100 万行约 30 秒)。因此,即使借助多处理,它也无法扩展,因为我总共拥有超过 10 亿条记录。我怎样才能让它更快?

【问题讨论】:

    标签: python pandas performance datetime timezone


    【解决方案1】:
    import pandas as pd
    
    # test dataframe with 1M rows
    df = pd.DataFrame({'DT': [1349720105, 1349806505, 1349892905, 1349979305, 1350065705]})
    df['DT'] = pd.to_datetime(df['DT'], unit='s')
    df = pd.concat([df]*200000).reset_index(drop=True)
    
    # display(df.head()
                     DT
    2012-10-08 18:15:05
    2012-10-09 18:15:05
    2012-10-10 18:15:05
    2012-10-11 18:15:05
    2012-10-12 18:15:05
    
    # convert the column
    df['DT'] = df['DT'].dt.tz_localize('UTC').dt.tz_convert('Europe/Amsterdam')
    
    # display(df.head())
                           DT
    2012-10-08 20:15:05+02:00
    2012-10-09 20:15:05+02:00
    2012-10-10 20:15:05+02:00
    2012-10-11 20:15:05+02:00
    2012-10-12 20:15:05+02:00
    
    print(df.info())
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 1000000 entries, 0 to 999999
    Data columns (total 1 columns):
     #   Column  Non-Null Count    Dtype                           
    ---  ------  --------------    -----                           
     0   DT      1000000 non-null  datetime64[ns, Europe/Amsterdam]
    dtypes: datetime64[ns, Europe/Amsterdam](1)
    memory usage: 7.6 MB
    

    另类

    • 当使用pandas.to_datetime() 转换为datetime dtype 时,此选项更加简洁并本地化为'UTC'
    df['DT'] = pd.to_datetime(df['DT'], unit='s', utc=True).dt.tz_convert('Europe/Amsterdam')
    
    • 来自 OP 的原始实现最耗时的方面是 x['dt'].tz_localize('UTC') 中的 .apply()
    • 以下代码在几毫秒内运行的时间大致相同。
    df['DT_1'] = pd.to_datetime(df['DT'], unit='s', utc=True).dt.tz_convert('Europe/Amsterdam')
    df['DT_2'] = pd.to_datetime(df['DT'], unit='s', utc=True).apply(lambda x: x.tz_convert('Europe/Amsterdam'))
    

    %%timeit 测试

    • 1M 行
    • 这将测试可比较的矢量化版本,与来自 OP 的带有 .apply() 的版本进行对比,其中 'DT' 已经转换为 datetime dtype
    %%timeit
    df['DT'].dt.tz_localize('UTC').dt.tz_convert('Europe/Amsterdam')
    [out]:
    4.4 ms ± 494 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    %%timeit
    df.apply(lambda x: x['DT'].tz_localize('UTC').tz_convert('Europe/Amsterdam'), axis=1)
    [out]:
    35.9 s ± 572 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 2018-10-01
      • 2017-02-07
      • 2013-01-08
      • 2018-12-27
      • 2016-09-15
      • 2018-08-03
      • 2015-06-22
      相关资源
      最近更新 更多