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

如何将Pandas数据集按指定格式写入文件?

固定格式地震数据输出的健壮实现方案

问题背景

我们有如下地震相关数据集(已合并为DataFrame):

import pandas as pd

p1=pd.DataFrame([2015,2017,2019], columns=['year'])
p2=pd.DataFrame([6, 9, 10], columns=['month'])
p3=pd.DataFrame([1, 7, 18], columns=['day'])
p4=pd.DataFrame([21, 5, 13], columns=['hpour'])
p5=pd.DataFrame([33, 8, 59], columns=['minute'])
p6=pd.DataFrame([7.16, 38.45, 31.40], columns=['second'])
p7=pd.DataFrame([56.7791, 33.214, 35.458], columns=['lat'])
p8=pd.DataFrame([70.5112, 69.2054, 73.6415], columns=['long'])
p9=pd.DataFrame([15.24, 8.64, 23.17], columns=['dep'])
p10=pd.DataFrame([5.4, 3.0, 6.1], columns=['mag'])
p11=pd.DataFrame([22122,22123, 22124], columns=['id'])
df=pd.concat([p1, p2, p3, p4, p5, p6,p7, p8, p9, p10, p11], axis=1)

需要将数据按固定格式输出到文件,格式规则为:

年份(4位)+3空格+2位月份+1空格+2位日期+1空格+2位小时+2位分钟+2位秒整数部分+3位秒小数部分+3位纬度整数部分+S+4位纬度小数部分+3空格+2位经度整数部分+E+4位经度小数部分+3空格+4位深度+1空格+2位震级+15空格+6位事件ID

示例输出行:

2015   06 01 21330716056S7791   70E5112   1524 54              022122

原方案采用直接字符串拼接,存在补零缺失、小数位数控制失效、格式混乱等问题,需要更健壮的实现方式。

健壮实现方案

利用Pandas的apply方法结合Python格式化字符串(f-string)逐行处理数据,精准控制每个字段的格式:

完整代码

import pandas as pd

# 构建数据集
p1=pd.DataFrame([2015,2017,2019], columns=['year'])
p2=pd.DataFrame([6, 9, 10], columns=['month'])
p3=pd.DataFrame([1, 7, 18], columns=['day'])
p4=pd.DataFrame([21, 5, 13], columns=['hpour'])
p5=pd.DataFrame([33, 8, 59], columns=['minute'])
p6=pd.DataFrame([7.16, 38.45, 31.40], columns=['second'])
p7=pd.DataFrame([56.7791, 33.214, 35.458], columns=['lat'])
p8=pd.DataFrame([70.5112, 69.2054, 73.6415], columns=['long'])
p9=pd.DataFrame([15.24, 8.64, 23.17], columns=['dep'])
p10=pd.DataFrame([5.4, 3.0, 6.1], columns=['mag'])
p11=pd.DataFrame([22122,22123, 22124], columns=['id'])
df=pd.concat([p1, p2, p3, p4, p5, p6,p7, p8, p9, p10, p11], axis=1)

def format_row(row):
    # 处理秒:拆分整数和小数部分,小数补到3位
    sec_int = int(row['second'])
    sec_dec = int(round((row['second'] - sec_int)*1000))
    # 处理纬度:整数部分补到3位,小数补到4位
    lat_int = int(row['lat'])
    lat_dec = int(round((row['lat'] - lat_int)*10000))
    # 处理经度:整数部分补到2位,小数补到4位
    lon_int = int(row['long'])
    lon_dec = int(round((row['long'] - lon_int)*10000))
    # 处理深度:整数+小数补到4位(如15.24→1524,8.64→0864)
    dep_str = f"{row['dep']*100:.0f}".zfill(4)
    # 处理震级:取整数部分+一位小数转成两位(如5.4→54,3.0→30)
    mag_str = f"{row['mag']*10:.0f}".zfill(2)
    # 处理事件ID:补到6位
    id_str = f"{row['id']}".zfill(6)
    
    # 按格式拼接整行
    return (f"{row['year']}   "
            f"{row['month']:02d} {row['day']:02d} "
            f"{row['hpour']:02d}{row['minute']:02d}{sec_int:02d}{sec_dec:03d}"
            f"{lat_int:03d}S{lat_dec:04d}   "
            f"{lon_int:02d}E{lon_dec:04d}   "
            f"{dep_str} {mag_str}              {id_str}")

# 生成所有行的格式化字符串
formatted_lines = df.apply(format_row, axis=1).tolist()

# 写入文件
with open('earthquake_data.txt', 'w') as f:
    f.write('\n'.join(formatted_lines))

方案优势

  • 精准格式控制:通过zfill()、格式化占位符({:02d})确保每个字段位数符合要求,自动补零
  • 小数处理可靠:通过数学运算拆分整数和小数部分,结合round()避免浮点精度问题
  • 可维护性强:每个字段的处理逻辑清晰,便于后续调整格式规则
  • 适配批量数据:利用Pandas的apply高效处理整表数据,避免循环拼接的繁琐

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 22:13:11