正确解析日期的excel格式

问题描述 投票:0回答:1

我一直在努力解决这个问题。我试过多个python excel库,它们似乎都存在相同的问题。对于xlsx文件,最终期望的结果实质上是“所见即所得”。与excel交互的所有python库都返回存储在excel中的值,并可能返回该值的相应格式。我正在努力使用该格式来实际获得一个值,该值看起来像您在excel或其他电子表格应用程序(如libre office calc)中看到的一样。

说,我们有一个工作表,上面一行看起来像这样:enter image description here

格式(使用libre office calc显示)在这里:enter image description here

现在这是一些代码,用于打开工作表并输出存储的值和格式

import openpyxl
book = openpyxl.load_workbook(
    'test.xlsx',
    read_only=True,
    data_only=False,
)
sheet = book.worksheets[0]
for row in sheet.iter_rows():
    for cell in row:
        print('FORMAT:', cell.number_format)
        print('VALUE:', cell.value)
        print('TYPE:', type(cell.value))

运行该代码(python 3.6.7,openpyxl 3.0.1)会产生以下截断的输出:

FORMAT: yyyy\-mm\-dd\Thh:mm\Z
VALUE: 2017-04-19 15:17:00.000004
TYPE: <class 'datetime.datetime'>
...

我的问题是,如何将格式字符串(yyyy-mm-dd \ Thh:mm \ Z)解析为有效的python strftime datetime表示形式。我开始编写一个简单的函数,该函数使用字符串替换将yyyy替换为%Y,将yy替换为%y,依此类推。但是后来我注意到格式字符串中有mm的两个实例,一个实例对应于月份,一个实例对应于分钟!您应该如何解析?月份总是第一吗?只有几分钟的时间会怎样?而且,如果您想要日期时间格式为时间第一,日期为第二怎么办?

任何帮助将不胜感激。要么是已经执行此操作的python库,要么是有据可查的xlsx文件格式的规范,该规范允许我构建自己的解析器(我找到了它,但似乎没有我想要的内容:https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-xls/300280fd-e4fe-4675-a924-4d383af48d3b),或者用另一种语言举例。如果可以将其推广到日期以外,并且始终用于所有Excel格式,那也很好。

python excel openpyxl xlsx strftime
1个回答
0
投票

问题:将字符串("yyyy-mm-dd\Thh:mm\Z")解析为有效的datetime.strftime格式代码。



import re
from datetime import datetime

class XLSXdatetime:
    translate = {'yyyy': '%Y', 'mm': '%m', 'dd': '%d', 
                 'hh:mm': '%H:%M', 'hh:mm:ss': '%H:%M:%S'}
    rec = re.compile(r'([\w:]+|\\.)')

    def __init__(self, xlsx_format):
        self.xlsx_format = xlsx_format

    @property
    def format(self):
        _format = []
        for item in XLSXdatetime.rec.findall(self.xlsx_format):
            if item.startswith('\\'):
                item = item[1:]
            _format.append(XLSXdatetime.translate.get(item, item))

        return ''.join(_format)

    def strftime(self, data):
        return data.strftime(self.format)

用法

  • data = datetime.strptime('2017-04-19 15:17:00.000004', '%Y-%m-%d %H:%M:%S.%f')
    print('data: {}'.format(data))
    
    # Long version
    for _format in ['yyyy-mm-dd hh:mm:ss', 
                    'yyyy\-mm\-dd\Thh:mm\Z'
                   ]:
        xlsx_datetime = XLSXdatetime(_format)    
        print("{} => {} = '{}'".format(_format, 
                                       xlsx_datetime.format, 
                                       xlsx_datetime.strftime(data)))
    

    输出

    data: 2017-04-19 15:17:00.000004
    yyyy-mm-dd hh:mm:ss => %Y%m%d%H:%M:%S = '2017041915:17:00'
    yyyy\-mm\-dd\Thh:mm\Z => %Y-%m-%dT%H:%MZ = '2017-04-19T15:17Z'
    

  • # Short version
    for _format in ['yyyy-mm-dd hh:mm:ss', 
                    'yyyy\-mm\-dd\Thh:mm\Z'
                   ]:
        print("'{}'".format(XLSXdatetime(_format).strftime(data)))
    

    输出

    data: 2017-04-19 15:17:00.000004
    '2017041915:17:00'
    '2017-04-19T15:17Z'
    

经过Python测试:3.6

© www.soinside.com 2019 - 2024. All rights reserved.