Python | 读取.dat 文件

server/2024/9/23 2:42:21/

写在前面

使用matlab可以输出为 .dat 或者 .mat 形式的文件,之前介绍过读取 .mat 后缀文件,今天正好把 .dat 的读取也记录一下。

读取方法

这里可以使用pandas库将其作为一个dataframe的形式读取进python,数据内容格式如下,根据空格分隔开分别为:

经度、纬度、年、月、日、时、分、秒、变量数值

python">
0	88.486	10.181	2023.0	3.0	20.0	0.0	15.0	0.0	3329.973
1	88.486	10.181	2023.0	3.0	20.0	0.0	30.0	0.0	3330.019
2	88.486	10.181	2023.0	3.0	20.0	0.0	45.0	0.0	3330.043
3	88.486	10.181	2023.0	3.0	20.0	1.0	 0.0	0.0	3330.077

由于原始的dat文件中是没有相关数据的信息的,这里为了方便后续处理,手动将其添加上相关的经纬度信息

需要注意的是,在直接将 DataFrame 传递给 pd.DataFrame 构造函数并指定列名时,如果原始 DataFrame 的列数和新列名的数量不匹配,可能会导致数据不一致,从而生成 NaN 值。使用 to_numpy() 方法将 DataFrame 转换为 NumPy 数组可以确保数据的一致性,因为它会忽略原始列名并仅保留数据。

  • 读取数据
python">import pandas as pd
from datetime  import datetime
import numpy as np
file_path = r'R:/ll/cj_YD_first_bpr_water_level.dat'df = pd.read_csv(file_path,  header=None,sep=r'\s+')df 

  • 添加经纬度信息
python">df_from_array = pd.DataFrame(df.to_numpy(), columns=['lon', 'lat', 'year', 'month', 'day', 'hour', 'min', 'sec', 'water'])

  • 将时间提取出来作为新的一列,方便后续绘图
python">df_from_array['datetime'] = df_from_array.apply(lambda row: datetime(year=int(row['year']),month=int(row['month']),day=int(row['day']),hour=int(row['hour']),minute=int(row['min']),second=int(row['sec'])),axis=1)
df_from_array

这里,做一个特殊的预处理,由于需要时刻的数据是相同的经纬度位置的,这里挑选出所有相同经纬度坐标点的数据

python">grouped = df_from_array.groupby(['lon', 'lat','datetime'])['water'].apply(list).reset_index()grouped

  • 发现存在缺测的站点,剔除掉缺测的经纬度数据
python">grouped = grouped[(grouped['lon'] != -9999.0000) & (grouped['lat'] != -9999.0000)]
grouped['water'] = grouped['water'].apply(lambda x: x[0])
grouped

绘图

挑选相同站点,不同时间的数据绘制曲线,为了避免不同位置的站点的数据大小存在较大差异,设置不同的y轴来表征

python">fig, ax1 = plt.subplots(figsize=(15, 10), dpi=200)
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['Times New Roman']
plt.rcParams['font.size'] = 16
axes = [ax1]
colors = plt.cm.tab10.colors
lines = []  
labels = []  
for i, (_, coord) in enumerate(unique_coords.iterrows()):lon = coord['lon']lat = coord['lat']filtered_data = grouped[(grouped['lon'] == lon) & (grouped['lat'] == lat)]if i == 0:ax = ax1else:ax = ax1.twinx()axes.append(ax)ax.spines['right'].set_position(('outward', 80 * (i - 1)))  color = colors[i % len(colors)]line, = ax.plot(filtered_data['datetime'], filtered_data['water'], color=color,linewidth=0.9, linestyle='-', label=f'Lon: {lon}, Lat: {lat}')ax.set_ylabel(f' (Lon: {lon}, Lat: {lat})')ax.yaxis.label.set_color(color)ax.tick_params(axis='y', colors=color)lines.append(line)labels.append(f'Lon: {lon}, Lat: {lat}')
ax1.legend(lines, labels, loc='best',ncols=2, bbox_to_anchor=(0.9, 1))
plt.xticks(rotation=55)
plt.grid()
fig.suptitle('Data Over Time for Different station', y=0.95)
plt.tight_layout()
plt.show()

总结

复习了一下使用pandas读取.dat文件的相关函数,以及pandas的一些基础命令,绘图多y轴的方法。相关数据和代码放到GitHub上

  • https://github.com/Blissful-Jasper/jianpu_record

http://www.ppmy.cn/server/120587.html

相关文章

Linux中使用cp命令的 -f 选项,但还是提醒覆盖的问题

问题: linux 在执行cp的命令的时候,就算是执行 cp -f 也还是会提醒是否要进行替换。 问题原因: 查看别名,alias命令,看到cp的别名为cp -i,那就是说cp本身就是自带覆盖提醒,就算我们加上-f 的…

8.JMeter+Ant(基于工具的实现接口自动化,命令行方式)

一、JMeterAnt(基于工具的实现接口自动化) 如果想要实现自动化,就必须使用命令行。 1.jmeter命令 -n 使用非界面的方式去执行脚本 -t 指定jmeter的脚本位置 -l 生成jtl报告,可以通过查看结果树来解析 -e 生产html格式的报告 -o …

【计算机网络篇】电路交换,报文交换,分组交换

本文主要介绍计算机网络中的电路交换,报文交换,分组交换,文中的内容是我认为的重点内容,并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 目录 🎯一.划分…

VUE3配置路由(超级详细)

第一步创建vue3的项目

【笔记】第三节 组织与性能

3.1 基本成分 3.2 微观组织特征 0.6-0.8C%碳素钢的组织为珠光体和少量的铁素体。 如何把组织和性能联系起来?德国克虏伯公司的研究——珠光体片间距与渗碳体片层厚度成比例: t s 0 ( ρ 15 ( C % ) − 1 ) ts_0(\frac{\rho}{15(C\%)}-1) ts0​(15(C%)…

从 CSS 到屏幕:揭秘浏览器渲染背后的小秘密

上文介绍了关于 CSS 属性的计算过程&#xff0c;本文介绍浏览器从 CSS 代码到最终的样式渲染过程中各个阶段的具体细节。 &#x1f4e2;&#xff1a;CSS 相关的面试题哦&#xff01; 1. 解析 (Parsing) 解析是浏览器处理 CSS 的第一个阶段。浏览器会从 CSS 文件或 <style…

JVM的CMS、G1以及ZGC对比

一、JVM回收器大比拼&#xff1a;CMS、G1与ZGC深度剖析 在Java的广袤宇宙中&#xff0c;JVM&#xff08;Java虚拟机&#xff09;是每位开发者不可或缺的伙伴。而垃圾回收器&#xff0c;作为JVM的“清洁工”&#xff0c;更是决定了我们应用的性能和响应速度。今天&#xff0c;就…

『功能项目』窗口可拖拽脚本【59】

本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目&#xff0c; 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本&#xff1a;DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…