如何实现.fits文件/astropy表与pandas df的双向格式转换
实现pandas DataFrame和.fits文件双向转换最简便的方案是基于astropy.table模块实现,不需要手动编写表头解析、数据类型映射的冗余逻辑,是目前天文数据处理场景下兼容性最好、代码量最少的实现方式。
提前安装依赖即可使用,执行命令:pip install pandas astropy
1. pandas DataFrame 导出为 .fits 文件
转换逻辑不需要逐列做类型映射,直接调用内置的转换方法即可,参考代码:
from astropy.table import Table # df为你需要导出的pandas DataFrame对象 # 先将DataFrame转为astropy标准表对象 t = Table.from_pandas(df) # 写入fits文件,overwrite=True参数允许覆盖路径下的同名旧文件 t.write("output_file.fits", overwrite=True)
使用注意点:
- pandas的行索引默认不会被写入fits文件,如果需要保留索引,转换前先执行
df = df.reset_index()把索引转为普通列即可 - 转换前请把DataFrame里的Python自定义对象、混合类型object列处理为定长字符串、数值、时间戳这类固定类型,fits标准不支持存储无固定长度的混合类型对象
2. .fits 文件转换为 pandas DataFrame
读取时可以直接指定要读取的HDU扩展,转换后自动适配pandas兼容的dtype,参考代码:
from astropy.table import Table # 读取fits文件,多扩展fits可以通过hdu参数指定要读取的扩展编号,通常表格数据存在hdu=1位置 t = Table.read("input_file.fits", hdu=1) # 直接转为pandas DataFrame df = t.to_pandas()
使用注意点:
- 如果fits列自带单位、描述等元信息,转换后会保存在DataFrame对应列的
attrs属性中,不会丢失 - 对于存储为图像格式的单/二维数组fits(比如CCD成像数据),可以先读取为numpy数组后再自行构造DataFrame,这类非表格式的fits不适用上述直接转换逻辑
- 转换过程中空值会自动适配为pandas兼容的
NaN/NaT类型,不需要手动处理缺失值
内容的提问来源于stack exchange,提问作者NeStack
相关产品推荐
相关产品推荐

