如何将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
相关产品推荐
相关产品推荐

