Hom*_*lli 16 python excel datetime data-munging
我需要将日期转换为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
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试一些示例日期时,数字与我在Excel中格式化日期时所获得的数字不同(以及OpenOffice Calc).例如,测试'2009-03-20'在Python中给出3478032000,而excel将序列号呈现为39892.
上面的公式出了什么问题?
*注意:我使用的是Python 2.6.3,因此无法访问datetime.total_seconds()
akg*_*ood 35
看来,Excel的"序列号"格式实际上是数天以来1900-01-00,随着小数部分,这是一个一天的一小部分,基于http://www.cpearson.com/excel/datetime.嗯.(我想这个日期实际上应该被认为是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)
Run Code Online (Sandbox Code Playgroud)
Jaz*_*hit 12
虽然这与excel序列日期格式不完全相关,但这是将Python日期时间导出到Excel的最高点.我发现特别有用和简单的是使用strftime导出.
import datetime
current_datetime = datetime.datetime.now()
current_datetime.strftime('%x %X')
Run Code Online (Sandbox Code Playgroud)
这将以下列格式输出'06/25/14 09:59:29',Excel将其作为有效日期/时间接受,并允许在Excel中进行排序.
如果问题是我们想要 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29948 次 |
| 最近记录: |