How to convert a python datetime.datetime to excel serial date number

前端 未结 6 1208
孤街浪徒
孤街浪徒 2020-11-27 16:01

I need to convert dates into Excel serial numbers for a data munging script I am writing. By playing with dates in my OpenOffice Calc workbook, I was able to deduce that \'1

相关标签:
6条回答
  • 2020-11-27 16:42

    While this is not exactly relevant to the excel serial date format, this was the top hit for exporting python date time to Excel. What I have found particularly useful and simple is to just export using strftime.

    import datetime
    current_datetime = datetime.datetime.now()
    current_datetime.strftime('%x %X')
    

    This will output in the following format '06/25/14 09:59:29' which is accepted by Excel as a valid date/time and allows for sorting in Excel.

    0 讨论(0)
  • 2020-11-27 16:43

    It appears that the Excel "serial date" format is actually the number of days since 1900-01-00, with a fractional component that's a fraction of a day, based on http://www.cpearson.com/excel/datetime.htm. (I guess that date should actually be considered 1899-12-31, since there's no such thing as a 0th day of a month)

    So, it seems like it should be:

    def excel_date(date1):
        temp = dt.datetime(1899, 12, 30)    # Note, not 31st Dec but 30th!
        delta = date1 - temp
        return float(delta.days) + (float(delta.seconds) / 86400)
    
    0 讨论(0)
  • 2020-11-27 16:43

    if the problem is that we want DATEVALUE() excel serial number for dates, the toordinal() function can be used. Python serial numbers start from Jan1 of year 1 whereas excel starts from 1 Jan 1900 so apply an offset. Also see excel 1900 leap year bug (https://support.microsoft.com/en-us/help/214326/excel-incorrectly-assumes-that-the-year-1900-is-a-leap-year)

    def convert_date_to_excel_ordinal(day, month, year) :
    
        offset = 693594
        current = date(year,month,day)
        n = current.toordinal()
        return (n - offset)
    
    0 讨论(0)
  • 2020-11-27 16:52

    With the 3rd party xlrd.xldate module, you can supply a tuple structured as (year, month, day, hour, minute, second) and, if necessary, calculate a day fraction from any microseconds component:

    from datetime import datetime
    from xlrd import xldate
    from operator import attrgetter
    
    def excel_date(input_date):
        components = ('year', 'month', 'day', 'hour', 'minute', 'second')
        frac = input_date.microsecond / (86400 * 10**6)  # divide by microseconds in one day
        return xldate.xldate_from_datetime_tuple(attrgetter(*components)(input_date), 0) + frac
    
    res = excel_date(datetime(1900, 3, 1, 12, 0, 0, 5*10**5))
    # 61.50000578703704
    
    0 讨论(0)
  • 2020-11-27 16:56

    This worked when I tested using the csv package to create a spreadsheet:

    from datetime import datetime
    
    def excel_date(date1):
        return date1.strftime('%x %-I:%M:%S %p')
    
    now = datetime.now()
    current_datetime=now.strftime('%x %-I:%M:%S %p')
    time_data.append(excel_date(datetime.now()))
    ...
    
    0 讨论(0)
  • 2020-11-27 17:02

    According to @akgood's answer, when the datetime is before 1/0/1900, the return value is wrong, the corrected return expression may be:

    def excel_date(date1):
        temp = dt.datetime(1899, 12, 30)    # Note, not 31st Dec but 30th!
        delta = date1 - temp
        return float(delta.days) + (-1.0 if delta.days < 0 else 1.0)*(delta.seconds)) / 86400
    
    0 讨论(0)
提交回复
热议问题