Convert Excel style date with pandas

前端 未结 2 1231
盖世英雄少女心
盖世英雄少女心 2020-11-27 19:53

I have to parse an xml file which gives me datetimes in Excel style; for example: 42580.3333333333.

Does Pandas provide a way to convert that number int

相关标签:
2条回答
  • 2020-11-27 20:13

    OK I think the easiest thing is to construct a TimedeltaIndex from the floats and add this to the scalar datetime for 1900,1,1:

    In [85]:
    import datetime as dt
    import pandas as pd
    df = pd.DataFrame({'date':[42580.3333333333, 10023]})
    df
    
    Out[85]:
               date
    0  42580.333333
    1  10023.000000
    
    In [86]:
    df['real_date'] = pd.TimedeltaIndex(df['date'], unit='d') + dt.datetime(1900,1,1)
    df
    
    Out[86]:
               date                  real_date
    0  42580.333333 2016-07-31 07:59:59.971200
    1  10023.000000 1927-06-12 00:00:00.000000
    

    OK it seems that excel is a bit weird with it's dates thanks @ayhan:

    In [89]:
    df['real_date'] = pd.TimedeltaIndex(df['date'], unit='d') + dt.datetime(1899, 12, 30)
    df
    
    Out[89]:
               date                  real_date
    0  42580.333333 2016-07-29 07:59:59.971200
    1  10023.000000 1927-06-10 00:00:00.000000
    

    See related: How to convert a python datetime.datetime to excel serial date number

    0 讨论(0)
  • 2020-11-27 20:22

    You can use the 3rd party xlrd library before passing to pd.to_datetime:

    import xlrd
    
    def read_date(date):
        return xlrd.xldate.xldate_as_datetime(date, 0)
    
    df = pd.DataFrame({'date':[42580.3333333333, 10023]})
    
    df['new'] = pd.to_datetime(df['date'].apply(read_date), errors='coerce')
    
    print(df)
    
               date                 new
    0  42580.333333 2016-07-29 08:00:00
    1  10023.000000 1927-06-10 00:00:00
    
    0 讨论(0)
提交回复
热议问题