Python+MATLAB處理氣象站點數據

2020-08-09 01:47:27

大數據時代,科研過程中被迫碼農,但是自己沒有經過系統的學習任何一門計算機語言,都是這瞭解一點那瞭解一點,每次針對出現的問題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)

使用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。