我在 excel 文件中有一些数据,我使用 pandas read_excel 方法读取它。 但是我想将所有列中的全部数据作为字符串读取,包括日期列。
问题是我想将日期列保留为字符串的原始格式。例如,我在 Excel 中有“31.01.2017”,它被格式化为日期,我想在我的数据框中有“31.01.2017”。
我认为使用 read_excel 的 dytpes 参数和 dtype=str 是正确的方法。但是 pandas 然后将日期列读取为日期时间,然后将其转换为字符串。所以最后我的数据框中总是有'2017-01-31 00:00:00'。
有什么办法吗?
最佳答案
Pandas 的行为是有道理的:
- 如果日期列的 excel 格式是文本,pandas 将读取 日期默认为字符串。
- 如果日期列的 excel 格式是日期,pandas 会将日期读取为日期。
但是,您指出在 Excel 文件中日期列的格式设置为日期。如果是这种情况,则您的 Excel 文件中没有字符串开头。日期列的基础数据存储为 float 。您看到的字符串不是实际数据。如果不是字符串,则无法将其作为原始字符串读取。
更多信息:https://xlrd.readthedocs.io/en/latest/formatting.html
但假设出于某种原因,您希望 Python 显示与 Excel 相同的格式,但以字符串形式显示,而不查看 Excel。
首先你必须找到格式:
from openpyxl import load_workbook
wb = load_workbook('data.xlsx')
ws = wb.worksheets[0]
print(ws.cell(1,5).number_format) # look at the cell you are interested in
> '[$]dd/mm/yyyy;@'
然后转换为 strftime 函数可以理解的内容。 https://www.programiz.com/python-programming/datetime/strftime#format-code
form = form[3:-2]
form = form.replace('dd','%d')
form = form.replace('mm','%m')
form = form.replace('yyyy','%Y')
print(form)
> '%d/%m/%Y'
并应用它
df.loc[:,"date_field"].apply(lambda x: x.strftime(form))
> 0 01/02/2018
1 02/02/2018
2 03/02/2018
3 04/02/2018
4 05/02/2018
但是,如果您使用多种 Excel 日期格式,则必须为每种格式创建一个 strf-time 映射。
可能会有更实用的方法来做到这一点,比如以 csv 格式接收数据,或者首先将日期保留为 excel 的文本格式。
关于Python Pandas - 将日期列读取为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46693095/