Pandas.read_excel 将日期读取到时间戳中,我想要一个字符串

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

我使用

.read_excel
将一个大的 Excel 文件读入 pandas,并且该文件具有日期列。当读入 pandas 时,日期默认为时间戳。由于文件很大,我想将日期作为字符串读取。

如果这是不可能的,那么我至少想以与原始文件中相同的格式将日期导出回Excel(例如

"8/18/2009"
)。

我的两个问题是:

  1. 我可以避免将 Excel 日期转换为 pandas 中的时间戳吗?
  2. 如果不可能,如何高效地以原始格式写回日期?
python pandas datetime import-from-excel
4个回答
3
投票
  1. 我不知道如何读取日期而不是使用 read_excel 转换为时间戳。
  2. 因为日期在将其读入数据帧时已经转换为日期时间,所以以下是如何以原始格式打印日期 - 我使用了“mm/dd/yyyy”。
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",
)

1
投票

这与此处的问题类似。 使用 python 中 pandas 的 read_excel 函数将日期保留为字符串

检查答案:

  • 在 pandas.read_excel 中使用转换器{'Date': str} 选项会有所帮助。
    pandas.read_excel(xlsx, sheet, converters={'Date': str})
  • 您可以尝试将时间戳转换回原始格式
    df['Date'][0].strftime('%Y/%m/%d')

1
投票

我也有同样的问题。 这就是为我解决问题的方法:

df = pd.read_excel(excel_link, sheet_name, dtype=str)

如果您不介意将 df 或整个列转换为字符串


0
投票

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” 数字格式。

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