下面的代码只是读取一个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()
是否有办法在读取文件时保留列类型(在初始文件中定义)或恢复为数据类型?
答案 0 :(得分:2)
您正在读取的csv文件肯定与excel文件不同。您可以在Windows中使用excel读取csv文件,但是保存文件时的编码是不同的。您当然可以根据xlsxwriter规范格式化单元格。
但是,请务必注意,xlsxwriter无法格式化任何已经具有诸如标头或索引,日期或日期时间对象之类的格式的单元格。如果您在单个列中有多个数据类型,那也会有问题,因为熊猫会将该列默认为对象。将在输出中推断出“对象”类型的项目,因此再次将其动态分配为“最佳猜测”。
当您读入csv时,如果要维护它,则应指定格式。现在,您正在让熊猫动态地执行此操作(熊猫将尝试使用前100个左右的行来猜测列类型)。
更改您在其中读入的行以包括dtypes,它们将保留在输出中。我将假设您的列具有标题"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的输出百分比。
如果您的列具有多种数据类型,则我的建议:不。这是无组织的,使下游应用程序的用例更加复杂。将更多的时间花在组织前端数据上,从而减少了后端的麻烦。