使用python爬取連續(xù)降水?dāng)?shù)據(jù)信息實(shí)例
介紹
給定每日的降水?dāng)?shù)據(jù)(數(shù)據(jù)可以缺測),提取存在連續(xù)降水的信息和累計(jì)降水量等。
程序使用python實(shí)現(xiàn),具體如下。
1 數(shù)據(jù)展示
這里以創(chuàng)建的隨機(jī)數(shù)為例:
time = pd.date_range(start='2020-01-01', end='2022-12-31', freq='D') np.random.seed(42) rain = np.random.uniform(-30, 30, size=len(time)) df = pd.DataFrame({'datetime':time, 'rain(mm)':rain}) df.loc[df['rain(mm)']<0, 'rain(mm)'] = 0 print(df)
打印結(jié)果如下,主要分成兩列,一列是時(shí)間datetime
,一列是降水量rain(mm)
。時(shí)間用來判斷是否鄰近同一天,降水用來判斷是否為降水天數(shù)。
datetime rain(mm)
0 2020-01-01 0.000000
1 2020-01-02 27.042858
2 2020-01-03 13.919637
3 2020-01-04 5.919509
4 2020-01-05 0.000000
... ... ...
1091 2022-12-27 8.978799
1092 2022-12-28 6.464208
1093 2022-12-29 0.761311
1094 2022-12-30 0.000000
1095 2022-12-31 0.000000[1096 rows x 2 columns]
2 思路
2.1 篩選出降水天數(shù)
篩選出降水大于0的天數(shù),并按照時(shí)間升序進(jìn)行排列。對于其他值,比如暴雨日數(shù)(日降水>50mm)也可以做同樣的篩選。
df_rain = df[df['rain(mm)']>0].copy() df_sort = df_rain.sort_values(by=['datetime'], ascending=True)
打印df_sort來看一下。
datetime rain(mm)
1 2020-01-02 27.042858
2 2020-01-03 13.919637
3 2020-01-04 5.919509
7 2020-01-08 21.970569
8 2020-01-09 6.066901
... ... ...
1088 2022-12-24 29.470118
1090 2022-12-26 26.563906
1091 2022-12-27 8.978799
1092 2022-12-28 6.464208
1093 2022-12-29 0.761311[549 rows x 2 columns]
2.2 計(jì)算間隔天數(shù)
與鄰近的前一天進(jìn)行時(shí)間相減計(jì)算,判斷間隔的天數(shù)。
df_sort['間隔天數(shù)'] = df_sort['datetime'] - df_sort['datetime'].shift(1) df_sort['間隔天數(shù)'] = df_sort['間隔天數(shù)'].apply(lambda x: x.days)
兩個(gè)日期相減出來,數(shù)據(jù)類型是timedelta64[ns]
,需要轉(zhuǎn)換為整數(shù),可以直接使用其屬性days
。
其中第一條對應(yīng)的間隔天數(shù)為空,值為np.nan
。
間隔天數(shù)
2.3 連續(xù)降水劃分
將出現(xiàn)連續(xù)降水的條數(shù)全部歸成一類,作為單獨(dú)的dataframe來操作,比如可以用來計(jì)算起止日期和連續(xù)天數(shù)等。
而在歸類時(shí)所有連續(xù)降水的條數(shù)均當(dāng)作獨(dú)特的一類,也就是類名需要唯一,因此這里設(shè)置成開始日期作為唯一值。這里創(chuàng)建新的一列(日期標(biāo)志
)來存儲(chǔ)類名。
日期標(biāo)志需要分成兩部分。
第一部分是不連續(xù)的日期,對應(yīng)的間隔天數(shù)
大于1,出現(xiàn)日期也對應(yīng)了其本身日期,另外第一天對應(yīng)的日期也是其本身。通過apply
方法來讀取間隔天數(shù)
和 datetime
進(jìn)行設(shè)置:
def start_date(df_in): delta = df_in['間隔天數(shù)'] if np.isnan(delta): return df_in['datetime'] elif delta>1.0: return df_in['datetime'] else: return None df_sort['日期標(biāo)志'] = df_sort[['間隔天數(shù)', 'datetime']].apply(start_date, axis=1)
不連續(xù)日期對應(yīng)標(biāo)志
第二部分是連續(xù)天數(shù),對應(yīng)的間隔天數(shù)
為1,可以用前面的數(shù)值來進(jìn)行填充,具體方法如下:
df_sort['日期標(biāo)志'].fillna(method='ffill', inplace=True)
連續(xù)日期對應(yīng)標(biāo)志
2.4 按類別進(jìn)行劃分
前一步中將連續(xù)天數(shù)的降水以開始日期來標(biāo)志了,也就是日期標(biāo)志
列中具有相同值的就算作連續(xù)降水,以groupby
函數(shù)對日期標(biāo)志
進(jìn)行劃分,并自定義函數(shù)來提取需要的信息。
def dateinfo(df): out = { '出現(xiàn)日期':df.iloc[0]['datetime'], '結(jié)束日期': df.iloc[-1]['datetime'], '持續(xù)天數(shù)': (df.iloc[-1]['datetime']-df.iloc[0]['datetime']).days+1, '累計(jì)降水量(mm)': df['rain(mm)'].sum(), } return pd.Series(out) out = df_sort.groupby(by='日期標(biāo)志').apply(dateinfo) out.to_excel('連續(xù)降水統(tǒng)計(jì).xlsx')
這里我提取了出現(xiàn)日期、結(jié)束日期、持續(xù)天數(shù)、累計(jì)降水量(mm),并作為一個(gè)Series
返回,最終存儲(chǔ)為DataFrame
。
持續(xù)降水信息
3 小結(jié)
通過給定的日降水?dāng)?shù)據(jù)(包含日期和降水)來判斷連續(xù)降水相關(guān)信息,比如起止日期、持續(xù)天數(shù)、累計(jì)降水量等。
當(dāng)然降水是以0為界,也可以設(shè)置成暴雨(50為界)判斷等,核心思路類似。
可以是針對其他的數(shù)據(jù),需要做連續(xù)發(fā)生天數(shù)的統(tǒng)計(jì)等。
打完,收工!
以上就是使用python提取連續(xù)降水?dāng)?shù)據(jù)信息實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于python提取降水?dāng)?shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
- Python庫textract提取各種文檔類型中文本數(shù)據(jù)
- Python腳本提取fasta文件單序列信息實(shí)現(xiàn)
- python網(wǎng)絡(luò)爬蟲基于selenium爬取斗魚直播信息
- Python?Haul利器簡化數(shù)據(jù)爬取任務(wù)提高開發(fā)效率
- Python爬蟲實(shí)現(xiàn)爬取下載網(wǎng)站數(shù)據(jù)的幾種方法示例
- Python協(xié)程異步爬取數(shù)據(jù)(asyncio+aiohttp)實(shí)例
- python爬取數(shù)據(jù)中的headers和代理IP問題分析
- python使用aiohttp通過設(shè)置代理爬取基金數(shù)據(jù)簡單示例
- Python實(shí)戰(zhàn)使用Selenium爬取網(wǎng)頁數(shù)據(jù)
相關(guān)文章
python實(shí)現(xiàn)鍵盤控制鼠標(biāo)移動(dòng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)鍵盤控制鼠標(biāo)移動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10詳解matplotlib中pyplot和面向?qū)ο髢煞N繪圖模式之間的關(guān)系
這篇文章主要介紹了詳解matplotlib中pyplot和面向?qū)ο髢煞N繪圖模式之間的關(guān)系,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01python基于queue和threading實(shí)現(xiàn)多線程下載實(shí)例
這篇文章主要介紹了python基于queue和threading實(shí)現(xiàn)多線程下載實(shí)例,是比較實(shí)用的技巧,需要的朋友可以參考下2014-10-10