python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python提取降水数据

使用python爬取连续降水数据信息实例

作者:里斯斯里 气象小筑

这篇文章主要为大家介绍了使用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&gt;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提取降水数据的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文