我在excel文件中有一些数据,我用pandas read_excel方法读取它。但是,我想将所有列中的整个数据作为字符串读取,包括日期列。
问题是我希望将日期列保留为原始格式的字符串。例如,我在excel中有'31 .01.2017',它被格式化为日期,我希望在我的数据框中有'31 .01.2017'。
我认为使用read_excel的dytpes参数和dtype = str是正确的方法。但是,pandas会将日期列读取为datetime,然后将其转换为字符串。所以最后我的数据框中总是有'2017-01-31 00:00:00'。
有没有办法做到这一点?
当您尝试将日期列保留在初始类型中时,以下代码可能对您有所帮助。在第一行中,我们向变量“cols”插入除日期列之外的所有列,然后在以下两行中我们只更改其余列的类型:
cols=[i for i in df.columns if i not in ["Date_column"]]
for col in cols:
df[col]=df[col].astype('category')
希望能帮助到你! :-)
df['date_column'] = df['date_column'].dt.strftime('%d.%m.%Y')
大熊猫的行为是有道理的:
但是,您指出在Excelfile中,日期列被格式化为日期。如果是这种情况,Excelfile中就没有字符串开头。 date列的基础数据存储为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的文本格式保存日期。