我需要将日期转换为Excel序列号,以用于我正在编写的数据修改脚本。通过在我的OpenOffice Calc工作簿中播放日期,我能够推断出'1-Jan 1899 00:00:00'映射到数字零。
我编写了以下函数来将python datetime对象转换为Excel序列号:
def excel_date(date1):
temp=dt.datetime.strptime('18990101', '%Y%m%d')
delta=date1-temp
total_seconds = delta.days * 86400 + delta.seconds
return total_seconds
但是,当我尝试一些示例日期时,这些数字与我在Excel中格式化日期时所获得的数字不同(以及OpenOffice Calc)。例如,测试'2009-03-20'在Python中给出3478032000,而excel将序列号呈现为39892。
上述公式有什么问题?
*注意:我使用的是Python 2.6.3,因此无法访问datetime.total_seconds()
答案 0 :(得分:33)
Excel“序列日期”格式实际上是自1900-01-00以来天的数量,基于{{3}的小数部分是一天的一小部分}。 (我想这个日期应该被认为是1899-12-31,因为没有一个月的第0天这样的事情)
所以,它似乎应该是:
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)
答案 1 :(得分:10)
虽然这与excel序列日期格式不完全相关,但这是将Python日期时间导出到Excel的最高点。我发现特别有用和简单的是使用strftime导出。
import datetime
current_datetime = datetime.datetime.now()
current_datetime.strftime('%x %X')
这将以下列格式输出'06 / 25/14 09:59:29',Excel将其作为有效日期/时间接受,并允许在Excel中进行排序。
答案 2 :(得分:0)
如果问题是我们想要日期的DATEVALUE()excel序列号,可以使用toordinal()函数。 Python序列号从1年1月1日开始,而excel从1900年1月1日开始,因此应用偏移量。另见excel 1900闰年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)
答案 3 :(得分:0)
使用第三方xlrd.xldate
模块,您可以提供一个结构为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
的元组,并在必要时根据任何微秒的组成部分来计算日分数:
COl_NAME + " TEXT, " +
答案 4 :(得分:0)
根据@akgood的answer,当日期时间在1/0/1900之前时,返回值错误,更正后的返回表达式可能是:
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
答案 5 :(得分:0)
当我使用csv package创建电子表格进行测试时,此方法有效:
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()))
...