我使用
.read_excel
将一个大的 Excel 文件读入 pandas,并且该文件具有日期列。当读入 pandas 时,日期默认为时间戳。由于文件很大,我想将日期作为字符串读取。
如果这是不可能的,那么我至少想以与原始文件中相同的格式将日期导出回Excel(例如
"8/18/2009"
)。
我的两个问题是:
import pandas as pd
df = pd.read_excel(
"file_to_read.xlsx",
sheet_name="sheetname",
)
writer = pd.ExcelWriter(
"file_to_write.xlsx",
engine="xlsxwriter",
datetime_format="mm/dd/yyyy",
)
df.to_excel(
writer,
index=False,
header=True,
sheet_name="sheetname",
)
这与此处的问题类似。 使用 python 中 pandas 的 read_excel 函数将日期保留为字符串
检查答案:
pandas.read_excel(xlsx, sheet, converters={'Date': str})
df['Date'][0].strftime('%Y/%m/%d')
我也有同样的问题。 这就是为我解决问题的方法:
df = pd.read_excel(excel_link, sheet_name, dtype=str)
如果您不介意将 df 或整个列转换为字符串
pd.read_excel
的文档在参数parse_dates
下说:
如果您不想将某些单元格解析为日期,只需将 Excel 中的类型更改为“文本”即可。
这意味着在使用 pd.read_excel
之前,可以将 Excel 中的单元格预处理为
“文本”数字格式。然而,单独切换到 "Text" 数字格式会将日期更改为 Excel 中的数字,例如,1900-12-31 变为 366(神秘数字是自 1900-01-01 以来的天数(此处为 366,因为Excel 错误地假定 1900 年是闰年))。这意味着仅将数字格式更改为“文本”的指令是没有用的。
相反,一个实用的解决方案是迭代日期列并将 Excel VBA
.Text
设置为值,并将数字格式更改为 “文本” 以返回其显示方式的字符串,这可以通过 完成xlwings:
from pathlib import Path
import xlwings as xw
import pandas as pd
path = Path(r"foo/test.xlsx")
with xw.App(visible=False):
wb = xw.Book(path)
ws = wb.sheets[0]
for cell in ws.used_range:
temp_str = cell.api.Text
cell.number_format = "@" # @ is the number format code of Excel for the "Text" number format.
cell.value = temp_str
wb.save(path.with_stem(f"{path.stem}_interim"))
# Then the Excel file can be read with xlwings.
df = ws.used_range.options(pd.DataFrame, index=False).value
wb.close()
# Or it can be read with pandas.
df = pd.read_excel(path.with_stem(f"{path.stem}_interim"))
print(df)
注意安装 xlwings 的先决条件。
不幸的是,
.Text
属性只能在一个单元格范围内使用,这就是为什么需要对相关单元格范围进行循环的原因。请注意,我在本例中使用了 used_range,这意味着工作表上包含内容的所有单元格都被格式化为 “Text” 数字格式。