You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python或其他工具转换格式混乱的.dat文件为.csv文件?

旧版CPS .dat文件转CSV的实用方法

这类2019年前的.dat文件本质是固定宽度格式文件,不是靠分隔符分割的,所以不能直接按空格/逗号拆分,得用对应年份的字段布局(数据字典)来解析,以下是两种靠谱的解决方案:

Python 实现(推荐)

用pandas的read_fwf专门处理固定宽度文件,步骤如下:

  1. 先找到对应年份的CPS数据字典(Record Layout),里面会明确每个字段的起始位置、长度、数据类型(比如AGE字段占4位、从第1位到第4位)。
  2. 编写代码解析并转换:
import pandas as pd

# 示例:根据数据字典定义字段名和对应宽度(实际要替换成目标年份的真实布局)
field_specs = [
    ('AGE', 4),
    ('HOUSEHOLD_INCOME', 8),
    ('INTERNET_ACCESS', 1),
    ('EDUCATION', 2)
]

# 生成pandas需要的列位置参数(起始索引,结束索引)
col_specs = []
prev_end = 0
for name, length in field_specs:
    col_specs.append((prev_end, prev_end + length))
    prev_end += length

# 读取.dat文件,指定缺失值标记
df = pd.read_fwf(
    'your_old_cps_data.dat',
    colspecs=col_specs,
    names=[name for name, _ in field_specs],
    na_values=['-', ' ', 'NaN']
)

# 处理特殊负数格式(比如部分文件用(123)表示-123)
df = df.replace(r'\((\d+)\)', r'-\1', regex=True)
# 转换为数值类型,无法转换的设为NaN
df = df.apply(pd.to_numeric, errors='coerce')

# 保存为CSV
df.to_csv('converted_cps_data.csv', index=False)

如果数据字典是可读取的文本文件,还可以写个小脚本自动提取字段位置,不用手动写field_specs。

其他工具方案

  • Stata:用infix命令按字段位置读取,再导出CSV:
infix AGE 1-4 HOUSEHOLD_INCOME 5-12 INTERNET_ACCESS 13-13 EDUCATION 14-15 using "old_cps_data.dat"
save "temp_stata_data.dta", replace
export delimited using "converted_cps_data.csv", replace
  • OpenRefine:适合非编程用户,导入.dat文件后选择「固定宽度分割」,手动拖动分隔线或输入每个字段的宽度,确认后直接导出为CSV。
  • SAS:通过infile和input语句指定字段宽度读取,再用proc export导出CSV。

注意:每个年份的CPS字段布局可能有差异,必须使用对应年份的数据字典,不能混用。

内容的提问来源于stack exchange,提问作者Thanh Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 11:02:43