使用python爬取连续降水数据信息实例
作者:里斯斯里 气象小筑
介绍
给定每日的降水数据(数据可以缺测),提取存在连续降水的信息和累计降水量等。
程序使用python实现,具体如下。
1 数据展示
这里以创建的随机数为例:
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)
打印结果如下,主要分成两列,一列是时间datetime
,一列是降水量rain(mm)
。时间用来判断是否邻近同一天,降水用来判断是否为降水天数。
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 筛选出降水天数
筛选出降水大于0的天数,并按照时间升序进行排列。对于其他值,比如暴雨日数(日降水>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 计算间隔天数
与邻近的前一天进行时间相减计算,判断间隔的天数。
df_sort['间隔天数'] = df_sort['datetime'] - df_sort['datetime'].shift(1) df_sort['间隔天数'] = df_sort['间隔天数'].apply(lambda x: x.days)
两个日期相减出来,数据类型是timedelta64[ns]
,需要转换为整数,可以直接使用其属性days
。
其中第一条对应的间隔天数为空,值为np.nan
。
间隔天数
2.3 连续降水划分
将出现连续降水的条数全部归成一类,作为单独的dataframe来操作,比如可以用来计算起止日期和连续天数等。
而在归类时所有连续降水的条数均当作独特的一类,也就是类名需要唯一,因此这里设置成开始日期作为唯一值。这里创建新的一列(日期标志
)来存储类名。
日期标志需要分成两部分。
第一部分是不连续的日期,对应的间隔天数
大于1,出现日期也对应了其本身日期,另外第一天对应的日期也是其本身。通过apply
方法来读取间隔天数
和 datetime
进行设置:
def start_date(df_in): delta = df_in['间隔天数'] if np.isnan(delta): return df_in['datetime'] elif delta>1.0: return df_in['datetime'] else: return None df_sort['日期标志'] = df_sort[['间隔天数', 'datetime']].apply(start_date, axis=1)
不连续日期对应标志
第二部分是连续天数,对应的间隔天数
为1,可以用前面的数值来进行填充,具体方法如下:
df_sort['日期标志'].fillna(method='ffill', inplace=True)
连续日期对应标志
2.4 按类别进行划分
前一步中将连续天数的降水以开始日期来标志了,也就是日期标志
列中具有相同值的就算作连续降水,以groupby
函数对日期标志
进行划分,并自定义函数来提取需要的信息。
def dateinfo(df): out = { '出现日期':df.iloc[0]['datetime'], '结束日期': df.iloc[-1]['datetime'], '持续天数': (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('连续降水统计.xlsx')
这里我提取了出现日期、结束日期、持续天数、累计降水量(mm),并作为一个Series
返回,最终存储为DataFrame
。
持续降水信息
3 小结
通过给定的日降水数据(包含日期和降水)来判断连续降水相关信息,比如起止日期、持续天数、累计降水量等。
当然降水是以0为界,也可以设置成暴雨(50为界)判断等,核心思路类似。
可以是针对其他的数据,需要做连续发生天数的统计等。
打完,收工!
以上就是使用python提取连续降水数据信息实例的详细内容,更多关于python提取降水数据的资料请关注脚本之家其它相关文章!