使用python爬取連續(xù)降水數(shù)據(jù)信息實例
介紹
給定每日的降水數(shù)據(jù)(數(shù)據(jù)可以缺測),提取存在連續(xù)降水的信息和累計降水量等。
程序使用python實現(xiàn),具體如下。
1 數(shù)據(jù)展示
這里以創(chuàng)建的隨機數(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é)果如下,主要分成兩列,一列是時間datetime
,一列是降水量rain(mm)
。時間用來判斷是否鄰近同一天,降水用來判斷是否為降水天數(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ù)(日降水>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 計算間隔天數(shù)
與鄰近的前一天進行時間相減計算,判斷間隔的天數(shù)。
df_sort['間隔天數(shù)'] = df_sort['datetime'] - df_sort['datetime'].shift(1) df_sort['間隔天數(shù)'] = df_sort['間隔天數(shù)'].apply(lambda x: x.days)
兩個日期相減出來,數(shù)據(jù)類型是timedelta64[ns]
,需要轉(zhuǎn)換為整數(shù),可以直接使用其屬性days
。
其中第一條對應(yīng)的間隔天數(shù)為空,值為np.nan
。
間隔天數(shù)
2.3 連續(xù)降水劃分
將出現(xiàn)連續(xù)降水的條數(shù)全部歸成一類,作為單獨的dataframe來操作,比如可以用來計算起止日期和連續(xù)天數(shù)等。
而在歸類時所有連續(xù)降水的條數(shù)均當作獨特的一類,也就是類名需要唯一,因此這里設(shè)置成開始日期作為唯一值。這里創(chuàng)建新的一列(日期標志
)來存儲類名。
日期標志需要分成兩部分。
第一部分是不連續(xù)的日期,對應(yīng)的間隔天數(shù)
大于1,出現(xiàn)日期也對應(yīng)了其本身日期,另外第一天對應(yīng)的日期也是其本身。通過apply
方法來讀取間隔天數(shù)
和 datetime
進行設(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['日期標志'] = df_sort[['間隔天數(shù)', 'datetime']].apply(start_date, axis=1)
不連續(xù)日期對應(yīng)標志
第二部分是連續(xù)天數(shù),對應(yīng)的間隔天數(shù)
為1,可以用前面的數(shù)值來進行填充,具體方法如下:
df_sort['日期標志'].fillna(method='ffill', inplace=True)
連續(xù)日期對應(yīng)標志
2.4 按類別進行劃分
前一步中將連續(xù)天數(shù)的降水以開始日期來標志了,也就是日期標志
列中具有相同值的就算作連續(xù)降水,以groupby
函數(shù)對日期標志
進行劃分,并自定義函數(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, '累計降水量(mm)': df['rain(mm)'].sum(), } return pd.Series(out) out = df_sort.groupby(by='日期標志').apply(dateinfo) out.to_excel('連續(xù)降水統(tǒng)計.xlsx')
這里我提取了出現(xiàn)日期、結(jié)束日期、持續(xù)天數(shù)、累計降水量(mm),并作為一個Series
返回,最終存儲為DataFrame
。
持續(xù)降水信息
3 小結(jié)
通過給定的日降水數(shù)據(jù)(包含日期和降水)來判斷連續(xù)降水相關(guān)信息,比如起止日期、持續(xù)天數(shù)、累計降水量等。
當然降水是以0為界,也可以設(shè)置成暴雨(50為界)判斷等,核心思路類似。
可以是針對其他的數(shù)據(jù),需要做連續(xù)發(fā)生天數(shù)的統(tǒng)計等。
打完,收工!
以上就是使用python提取連續(xù)降水數(shù)據(jù)信息實例的詳細內(nèi)容,更多關(guān)于python提取降水數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
- Python庫textract提取各種文檔類型中文本數(shù)據(jù)
- Python腳本提取fasta文件單序列信息實現(xiàn)
- python網(wǎng)絡(luò)爬蟲基于selenium爬取斗魚直播信息
- Python?Haul利器簡化數(shù)據(jù)爬取任務(wù)提高開發(fā)效率
- Python爬蟲實現(xiàn)爬取下載網(wǎng)站數(shù)據(jù)的幾種方法示例
- Python協(xié)程異步爬取數(shù)據(jù)(asyncio+aiohttp)實例
- python爬取數(shù)據(jù)中的headers和代理IP問題分析
- python使用aiohttp通過設(shè)置代理爬取基金數(shù)據(jù)簡單示例
- Python實戰(zhàn)使用Selenium爬取網(wǎng)頁數(shù)據(jù)
相關(guān)文章
詳解matplotlib中pyplot和面向?qū)ο髢煞N繪圖模式之間的關(guān)系
這篇文章主要介紹了詳解matplotlib中pyplot和面向?qū)ο髢煞N繪圖模式之間的關(guān)系,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01python基于queue和threading實現(xiàn)多線程下載實例
這篇文章主要介紹了python基于queue和threading實現(xiàn)多線程下載實例,是比較實用的技巧,需要的朋友可以參考下2014-10-10