第 八 星 系
Python|基于python利用多年降水日数据计算逐年逐季节各站点降水日数
本文将用该文献提供的标准,基于python利用多年降水日数据计算逐年逐季节各站点降水日数。
部分元数据如图所示:
import pandas as pd
import numpy as np
import calendar
from datetime import datetime
# 加载数据
file_path = 'PRE_DAYS.xlsx'
df = pd.read_excel(file_path, index_col=0) # 假设第一列是日期
# 确保日期列是 datetime 类型
df.index = pd.to_datetime(df.index)
# 定义季节划分
seasons = {
'spring': (3, 4, 5),
'summer': (6, 7, 8),
'autumn': (9, 10, 11),
'winter': (12, 1, 2),
}
# 定义降水等级
def precipitation_level(rainfall):
if 0.1 <= rainfall < 10.0:
return '小雨'
elif 10.0 <= rainfall < 20.0:
return '中雨'
elif 25.0 <= rainfall < 50.0:
return '大雨'
elif rainfall >= 50.0:
return '暴雨'
else:
return '无降水'
# 应用函数以确定降水等级
df = df.apply(lambda x: x.map(precipitation_level))
# 创建多层索引的 DataFrame 来存储结果
index = pd.MultiIndex.from_product(
[range(1964, 1978), ['spring', 'summer', 'autumn', 'winter'], ['小雨', '中雨', '大雨', '暴雨']],
names=["Year", "Season", "Precipitation_Type"]
)
results = pd.DataFrame(index=index)
# 遍历每个季节和每一年
for season, months in seasons.items():
for year in range(1964, 1978):
if season == 'winter':
# 特殊处理冬季跨年情况
start_date = f"{year-1}-12-01" # 上一年的12月1日
feb_days = calendar.monthrange(year, 2)[1] # 当年2月的最后一天
end_date = f"{year}-02-{feb_days}"
else:
start_date = f"{year}-{min(months)}-01"
end_date = f"{year}-{max(months)}-{calendar.monthrange(year, max(months))[1]}"
# 选取当前季节和年份的数据
season_data = df[start_date:end_date]
# 仅选择季节对应月份
season_data = season_data[season_data.index.month.isin(months)]
for column in df.columns:
# 计算每种类型的降水日数
counts = season_data[column].value_counts()
for precipitation_type in ['小雨', '中雨', '大雨', '暴雨']:
idx = (year, season, precipitation_type)
results.loc[idx, column] = counts.get(precipitation_type, 0)
# 重排列 DataFrame 以方便查看
results = results.sort_index().fillna(0).astype(int) # 填充空值并转换为整数
# 输出结果
print(results)
# 可选:将结果保存到新的 Excel 文件
results.to_excel('pre1.xlsx')
部分统计结果如图所示:
后台私信:第八星系
群内每日更新分享数据
进群请勿回复 第八星系 以外字词
本文编辑| 枫阁