如何用Python将CSV转为Excel并保留正确的数据类型格式?
解决CSV转Excel时保留数字和日期类型的问题
我来帮你搞定这个问题!你遇到的情况是因为pandas在读取CSV时,没能正确推断出数字和日期列的类型,导致写入Excel时还是以字符串形式保存。下面是具体的解决方案:
问题根源
默认情况下,pandas读取CSV时会自动推断列类型,但如果日期格式不是标准格式(比如你的15-Jul-16),或者CSV中数字列存在特殊情况(比如前导空格、混合字符),就会被识别为字符串(object类型),写入Excel后自然还是字符串格式。
解决方案:读取时明确指定类型和解析规则
我们可以在read_csv时通过参数强制指定列类型、解析日期,确保数据类型正确,再写入Excel就会保留正确格式了。
修改后的代码如下:
import pandas as pd # 读取CSV,明确指定数字列类型并解析日期 df = pd.read_csv( "input.csv", # 强制指定rollno和marks为整数类型(如果有缺失值可以用'Int64',支持空值的整数类型) dtype={'rollno': int, 'marks': int}, # 标记需要解析为日期的列 parse_dates=['doj'], # 用明确的日期格式解析,避免pandas推断错误 date_parser=lambda x: pd.to_datetime(x, format='%d-%b-%y') ) # 取前3000行 df = df.head(n=3000) # 保存为Excel,推荐用xlsx格式(比xls更稳定),指定openpyxl引擎 df.to_excel("output.xlsx", index=None, header=None, engine='openpyxl')
关键参数说明
dtype:直接指定数字列的类型,确保pandas不会把它们识别为字符串。如果你的数字列存在缺失值,把int换成'Int64'(大写I,支持空值的整数类型)即可。parse_dates:告诉pandas把指定列解析为日期时间类型。date_parser:用自定义的格式字符串%d-%b-%y(对应日-月份缩写-两位年份)来解析日期,确保格式完全匹配你的数据,避免推断错误。engine='openpyxl':因为xlsx格式需要这个引擎支持,它能更好地保留数据类型,比旧的xls格式更可靠。
验证方法
读取数据后,可以用print(df.dtypes)查看各列类型,确认:
rollno和marks是int64(或Int64)类型doj是datetime64[ns]类型
这样写入Excel后,数字列会是数字类型,日期列会是Excel可识别的日期格式啦!
内容的提问来源于stack exchange,提问作者Aneel kumar




