【问题标题】:pd.read_csv - epoch date conversionpd.read_csv - 纪元日期转换
【发布时间】:2018-01-29 00:16:28
【问题描述】:

我有带有日期列的 csv,例如 Bill Date,存储为日期的 Excel 序列号。所以 12/15/2017 在 csv 中表示为 43084。我需要在我的 DataFrame 中将其转换为 Pandas / Python 识别的实际日期。所以,我的问题是:有没有比我用来转换日期的方法更有效的方法?

df:
    Bill Date
0       43084

Excel 将日期存储为自 1900 年 1 月 1 日以来的天数,pandas 默认为 1970 年 1 月 1 日。

diff = pd.Timestamp('1970-01-01') - pd.Timestamp('1900-01-01')
pd.to_datetime([43084 - (diff.days + 2)], unit='d')

DatetimeIndex(['2017-12-15'], dtype='datetime64[ns]', freq=None)

那么,我是否遗漏了一些明显的东西(例如,不同来源的选项)?

【问题讨论】:

    标签: python excel pandas


    【解决方案1】:

    这样做:

     import pandas as pd
     from datetime import datetime
    
     df = pd.read_csv("yourdataframe.csv")
     df["Bill_Date"] = df["Bill_Date"].map(lambda x: datetime.fromordinal(datetime(1900, 1, 1).toordinal() + x - 2))
     df["Bill_Date"] = df["Bill_Date"].map(lambda x: x.strftime("%Y-%m-%d"))
    
     print df.head()
    

    【讨论】:

    • 谢谢,我使用的方法实际上更快。所以,我不确定这是否更有效。
    • 您计算过这种方式占用数据的时间吗?
    • 另外,我以为您要求的是功能而不是速度。无论如何,您的方法运行良好且速度更快,这很好。祝你的代码好运。
    • %%timeit df["Bill_Date"].map(lambda x: datetime.fromordinal(datetime(1900, 1, 1).toordinal() + x - 2)) ....73.4 µs ± 3.04 µs 每个循环
    • %%timeit pd.to_datetime(df['Bill_Date'].values - (diff.days + 2), unit='d') .....47.2 µs ± 2.12 µs 每个循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2011-10-04
    • 2017-06-22
    相关资源
    最近更新 更多