我需要将日期转换为我正在编写的数据转换为Excel序列号脚本。通过处理我的OpenOffice计算工作簿中的日期,我能够推断出'1-Jan 1899 00:00:00‘映射到数字0。
我编写了以下函数将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计算)时得到的数字不同。例如,测试'2009-03-20‘在Python中显示3478032000,而excel将序列号呈现为39892。
上面的公式有什么问题?
*注意:我使用的是Python2.6.3,所以不能访问datetime.total_seconds()
发布于 2012-03-06 06:22:08
根据http://www.cpearson.com/excel/datetime.htm,Excel的“序列日期”格式实际上是自1900-01-00以来的天数,带有小数部分,是一天的一小部分。(我猜这个日期实际上应该被认为是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)
发布于 2014-06-25 22:03:41
虽然这与Excel序列日期格式并不完全相关,但这是将python日期时间导出到excel的最佳选择。我发现特别有用和简单的是使用strftime导出。
import datetime
current_datetime = datetime.datetime.now()
current_datetime.strftime('%x %X')
这将以以下格式输出:'06/25/14 09:59:29‘,Excel接受该格式作为有效的日期/时间,并允许在Excel中进行排序。
发布于 2017-11-25 02:47:19
如果问题是我们需要DATEVALUE() excel序列号作为日期,那么可以使用toordinal()函数。Python序列号从1年的Jan1开始,而excel从1900年1月1日开始,因此应用偏移量。另请参阅excel 1900闰年错误(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)
https://stackoverflow.com/questions/9574793
复制相似问题