关于使用 python 将字符串导出为日期的 xlsxWriter 问题

xlsxWriter issue regarding exporting String as dates using python

我有一个列表,其中包含以下格式的日期:11/01/2019。这个日期我转换为字符串。当我将此列表导出到 Excel 时,Excel sheet 将这些字符串识别为日期。有没有办法让 [=18= 识别这些日期] 作为字符串使用 python?非常感谢。

DateTable
11/01/2019
12/01/2019
13/01/2019
data.insert(0, {'Date':datetime.strptime(str(DateTable)[j]),'%d/%m/%Y').strftime('%d/%m/%Y')})
self.date.to_excel('date.xlsx', sheet_name = 'Sheet1', index=False, engine='xlsxwriter') 

您需要将单元格的数字格式设置为“纯文本”,即{'num_format': '@'}

workbook = Workbook("output.xlsx")
cell_format = workbook.add_format({'num_format': '@'})
worksheet = workbook.add_worksheet()
worksheet.write(0, 0, "15/12/2021", cell_format)
workbook.close()

与 pandas:

writer = pd.ExcelWriter("output.xlsx")
df.to_excel(writer, 'Sheet1')
workbook = writer.book
worksheet = writer.sheets['Sheet1']
cell_format = workbook.add_format({"num_format": "@"})
worksheet.set_column('A', 1, cell_format)
writer.save()

要了解利害关系,请阅读 The Spanish family wrongly accused of child pornography due to a mistake reading a date

从评论来看,真正的问题似乎是如何生成一个 Excel 文件并导入到另一个应用程序中。不要将日期转换为字符串,尤其是在这种情况下

如果要以某种方式显示日期,请在创建 ExcelWriter 对象时指定日期显示格式:

writer = pd.ExcelWriter("pandas_datetime.xlsx",
                        engine='xlsxwriter',
                        datetime_format='dd/mm/yyyy hh:mm:ss',
                        date_format='dd/mm/yyyy')

Excel 文件不是文本,所有可以导入 Excel 文件的库都可以处理日期值,或者知道读取数字或日期的格式化文本值。

应用程序可以毫无问题地导入 Excel 日期。这是 Excel 优于 CSV 文件的一个优势 - 数字和日期是二进制值,它们不需要解析并且不受本地化设置的影响。

如果应用程序必须处理文本,则总是有可能使用错误的格式,例如,因为机器的区域设置已更改,因为生成 Excel sheet 的人制作了一个错误,因为应用程序必须从使用不同格式的多个其他系统导入文件。

说明

Python(以及 C#、Java、JavaScript、MySQL、PostgreSQL 等)中的日期没有格式。它们是二进制类型。只有在将字符串解析为日期或将日期格式化为用于导出或显示的字符串时,格式才适用。

Excel 也有日期类型。日期和数字不存储为字符串,它们存储为二进制值。它们的显示方式取决于单元格的数字格式。日期存储为 OADate 小数,其整数部分是 1899-12-30 的偏移量,小数部分是 24 小时内的时间。

如果要以特定格式显示日期,请在单元格样式中指定。

XlsxWriter 文档在 Working with dates and time 中解释了如何做到这一点。这些示例实际上使用了您想要的格式:

workbook = xlsxwriter.Workbook('date_examples.xlsx')
worksheet = workbook.add_worksheet()

# Widen column A for extra visibility.
worksheet.set_column('A:A', 30)

# A number to convert to a date.
number = 41333.5

# Write it as a number without formatting.
worksheet.write('A1', number)                # 41333.5

format2 = workbook.add_format({'num_format': 'dd/mm/yy'})
worksheet.write('A2', number, format2)       # 28/02/13

format3 = workbook.add_format({'num_format': 'mm/dd/yy'})
worksheet.write('A3', number, format3)       # 02/28/13

虽然您不必将日期转换为 OADate 十进制。您可以直接存储日期。 XlsxWriter :

... supports datetime objects of type datetime.datetime, datetime.date, datetime.time and datetime.timedelta.

XlsxWriter 文档展示了如何 work with dates in Pandas as well。甚至更简单 - 只需将所需格式作为参数传递即可:

import pandas as pd
from datetime import datetime, date

# Create a Pandas dataframe from some datetime data.
df = pd.DataFrame({'Date and time': [datetime(2015, 1, 1, 11, 30, 55),
                                     datetime(2015, 1, 2, 1,  20, 33),
                                     datetime(2015, 1, 3, 11, 10    ),
                                     datetime(2015, 1, 4, 16, 45, 35),
                                     datetime(2015, 1, 5, 12, 10, 15)],
                   'Dates only':    [date(2015, 2, 1),
                                     date(2015, 2, 2),
                                     date(2015, 2, 3),
                                     date(2015, 2, 4),
                                     date(2015, 2, 5)],
                   })

# Create a Pandas Excel writer using XlsxWriter as the engine.
# Also set the default datetime and date formats.
writer = pd.ExcelWriter("pandas_datetime.xlsx",
                        engine='xlsxwriter',
                        datetime_format='dd/mm/yyyy hh:mm:ss',
                        date_format='dd/mm/yyyy')

# Convert the dataframe to an XlsxWriter Excel object.
df.to_excel(writer, sheet_name='Sheet1')

...
# Close the Pandas Excel writer and output the Excel file.
writer.save()