Python+MATLAB处理气象站点数据

大数据时代,科研过程中被迫码农,但是自己没有经过系统的学习任何一门计算机语言,都是这了解一点那了解一点,每次针对出现的问题Baidu,于是虽然能够每次也能顺利实现现阶段出现的问题,但是效率太低,没有系统性,自己也很难受。现阶段用过的有MATLAB和Python比较多,最多时候其实也还是Excel,所以VB也了解一些,很杂乱,不过也算摸到了点门路。如题所示,针对现阶段的问题还是不免不能将一门语言用精用通,所以最后还是二者结合,此文作为第一篇博,记录一下辣鸡科研狗的被迫码农过程,以及为后续想学精Python立个flag。

使用cmd实现多个txt文件的合并气象月数据文档四百多个...

下载的气象数据按月分为超级多txt文档,很懒的利用最简单无任何技术含量和“前情提要”的cmd命令方式实现:

d:
cd d:\data\pre
type *.txt >>..\..\pre.txt

使用Python的merge实现Excel的VLOOKUP功能

画图软件:科研至今,虽然也用过Origin和MATLAB等画过图,但是无敌挚爱还是Excel,可能就是因为难以逃离舒适圈,而且自己早已习惯,但是真心觉得自己想呈现的Origin能做到的,Excel也可以。(可能还没有做到什么特别高大上的图…)
夸夸:Excel的VLOOKUP真心很好用,功能之一是能够实现两个数据通过相同部分的标签融合,跟Python中的merge一样。
Why Python merge:Excel一个sheet最多数据承载量是1048576行,所下载的气象数据远远多于这个量(800w条),VLOOKUP不行;想用MATLAB过,但是自己尝试写的代码都是基础的for if,而且是多层嵌套,速度太太太慢(MATLAB处于入门,所以可能有更好的办法,我也没有百度到,查到的唯一就是切片还是啥的),遂弃;Python有现成的模块函数,且快,遂用之。
Aim:因为想得到的物理量需要用到两个气象数据计算,所以要根据站点年月日将二者合并(两个气象数据可能会排序有误差,不能直接并列合并)。
气象数据格式
不知道为啥一开始的800w数据出现内存问题,所以拆成两个txt,各400w,能够很快实现合并且导出到csv文档中。

# -*- coding: utf-8 -*-
import columns as columns
import pandas as pd
import csv
from pandas.core.frame import DataFrame

prs_info=open("D:\\***\\day\\tem\\Ta1.txt")    #打开表一
vap_info=open("D:\\***\\day\\vap\\ea1.txt")  #打开表二
prs_reader= csv.reader(prs_info, delimiter=' ')  #逐行读取表一数据
list1=[]
n=0
for onea_line in prs_reader:
    line1 = list(filter(None,onea_line))
    list1.append(line1)
    n+=1
vap_reader=csv.reader(vap_info, delimiter=' ')  #逐行读取表二数据
list2=[]
m=0
for oneb_line in vap_reader:
    line2 = list(filter(None, oneb_line))
    list2.append(line2)
    m+=1
# 按照相同的数据提取另一个表中的相关信息
df1 = pd.DataFrame(list1, columns=['id', 'lat', 'lon', 'year', 'month', 'day', 'p', 'pM', 'pm'])
df2 = pd.DataFrame(list2, columns=['id', 'lat', 'lon', 'year', 'month', 'day', 'e', 'eM', 'em'])
df = pd.merge(df1, df2, how='inner', on=['id', 'year','lat', 'lon', 'month', 'day'], right_index=True)
df.sort_index(inplace=True)
# 将dataframe写入csv文件
df.to_csv("D:\\***\\day\\eaTa1980_1999.csv")
# read_csv=pd.read_csv("choice_radar.csv")
# print(read_csv)

**2021.4.4更新=======================**
matlab对于上述的功能直接有一个函数intersect(),超级方便,立等可取。
**嘻嘻================================**

使用MATLAB实现日值转月值年值

开始还是想用for和if计算年值月值,但是太慢,觉得for和if,特别是if的嵌套使用丢失了MATLAB矩阵的特点,于是也是经过baidu,勉强写出了快速实现月值年值的计算方法。

clear;
clc;
tic;
%Importdata导入txt数据-------------
filename1 = 'D:\***\day\ep1980_1999.csv';
delimiterIn = ',';      %列分隔符
headerlinesIn = 1;      %读取从headerlinesIn+1行开始的数值数据
indata1 = importdata(filename1,delimiterIn,headerlinesIn);
qqq = indata1.data;
%去除无效值,转为nan,此为处理气象数据必备一步
qnan=qqq(:,8:13);
qnan(qnan(:,:)>20000)=nan;
qqq(:,8:13)=qnan;
aaa = numel(find(isnan(qnan)));
%②计算日值--------------
qqq(:,14) = qqq(:,11)./qqq(:,8)
%计算月值----------------
year=1980:2018;
station = unique(qqq(:,2));
for yy = 1:39
    a = qqq(qqq(:,5)==year(yy),:);
    layer = zeros(579,12);
    layer1 = zeros(579,12);
    for ss = 1:579
        b=a(a(:,2)==station(ss),:);
        b1=a1(a1(:,2)==station(ss),:);
        for mm = 1:12
            c = b(b(:,6)==mm,:);
            layer(ss,mm)=nanmean(c(:,14));
        end
    end
    qqq_month(:,:,yy)=layer(:,:);
end
q_month2 = reshape(q_month,579,468);
%计算年值--------------------
%同月值,更简单,不赘述
toc;

在学习精进Python中,希望下次All in Python。

  • 9
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值