pandas指定columns构造DataFrame导出CSV数据为空的原因排查
问题根因
你遇到的两个异常都是代码逻辑和pandas接口用法不匹配导致的:
- 第一列时间小时位截断:
pd.read_table默认会自动推断列类型,第一列的时间格式字符串会被自动解析为datetime类型,导出CSV时没有指定时间序列化格式,前置带0的小时位会被默认格式规则截断。 - 指定列名后数据全空:你是在数据读取完成、生成默认列名为0/1/2的DataFrame之后,再给
pd.DataFrame()传入columns=col1参数。这个参数的作用是从现有数据中筛选指定名称的列,原数据里不存在叫time/skin/micro的列,所以最终生成的是只有列名、全为空值的表。
修正后可运行代码
import pandas as pd file_path = './data/up/34-up.txt' # 读取阶段直接配置参数,从根源规避两个问题 data = pd.read_table( file_path, header=None, delim_whitespace=True, names=["time", "skin", "micro"], # 读入时直接设置列名,不需要读完再重命名 dtype={"time": str} # 强制时间列按原始字符串读取,禁止自动转datetime导致格式截断 ) # 导出时关闭行索引写入,避免生成多余的序号列 data.to_csv('34.csv', index=False)
关键注意点
- 列名设置要在读取函数内通过
names参数完成,不要在DataFrame初始化阶段通过columns参数给已经生成的表设置新列名,后者不会做重命名,只会做列筛选。 - 对于不需要做时间计算、只需要保留原始格式的时间字符串,显式指定
dtype=str可以避免pandas自动类型推断带来的各种格式异常。 - 导出CSV时默认会把pandas自带的整数行索引写入文件,加
index=False可以去掉这列无意义数据。
内容的提问来源于stack exchange,提问作者Wilhelm
相关产品推荐
相关产品推荐

