下面的代码简单地读入一个excel文件,将其存储为一个df,然后将df写回一个excel文件。当我在excel中打开输出文件时,列(日期、数字)不同...有些是文本,有些是数字等。
import pandas as pd
df = pd.read_csv("test.csv", encoding = "ISO-8859-1", dtype=object)
writer = pd.ExcelWriter('outputt.xlsx', engine='xlsxwriter')
df.to_excel(writer, index = False, sheet_name='Sheet1') #drop the index
writer.save()
有没有办法保留列类型(如初始文件中定义的那样)或恢复为读入文件时的数据类型?
发布于 2019-03-29 03:37:15
您正在读取的csv文件肯定与excel文件不同。您可以在Windows中使用excel读取csv文件,但保存文件时的编码不同。您当然可以根据xlsxwriter规范设置单元格的格式。
但是,重要的是要注意,xlsxwriter不能格式化任何已经具有日期或日期时间对象等格式的单元格。如果在单个列中有多个数据类型,这也将是有问题的,因为pandas会将该列默认为object。"object“类型的项目将在输出中被推断,因此它将再次被动态分配为”最佳猜测“。
当你读入你的csv时,如果你想保留它,你应该指定格式。现在,您可以让pandas动态地执行此操作(Pandas将尝试使用前100行左右的行来猜测列类型)。
更改读入的行以包含数据类型,它们将保留在输出中。我将假设您的专栏具有标题"ColumnA", "ColumnB", "ColumnC"
import pandas as pd
from datetime import datetime
df = pd.read_csv("test.csv", encoding = "ISO-8859-1", dtype={'ColumnA': int,
'ColumnB': float,
'ColumnC': str})
让我们使用"ColumnC“作为日期的列示例。我喜欢首先以字符串的形式读取日期,然后确保我想要的格式。因此,您可以添加以下内容:
df['ColumnC'] = pd.to_datetime(df['ColumnC'].dt.strftime('%m/%d/%Y')
# date would look like: 06/08/2016, but you can look at other formatting for dt.strftime
这将确保输出中的特定类型。可以应用进一步的格式化,例如浮点数中的小数位数,包括通过遵循指南here的输出中的百分比。
如果您有具有多种数据类型的列,我的建议是:不要使用。这是无组织的,并使下游应用程序的用例更加复杂。花更多的时间在前端组织数据,这样你在后端就不会那么头疼了。
https://stackoverflow.com/questions/55405209
复制相似问题