# -*- coding: utf-8 -*-
"""
@Author: xxx
@Features of this code:计算逐站逐年极端高温;逐年逐站高温出现的初日和终日;最长连续高温
"""
import pandas as pd
import numpy as np
data = pd.read_excel('高温1961-2021.xlsx')
data = np.array(data)
print('结束数据读取')
# 年份转换行数
mark = []
for i in range(4, len(data) - 1):
if data[i, 0] != data[i + 1, 0]:
mark.append(i)
mark.insert(0, 3)
# 逐年逐站极端高温;逐年逐站高温出现的初日和终日;最长连续高温
tmax = np.zeros([len(mark) - 1, np.size(data, 1)])
max_htdays = np.zeros([len(mark) - 1, np.size(data, 1)])
day_begin = np.zeros([len(mark) - 1, np.size(data, 1)])
day_end = np.zeros([len(mark) - 1, np.size(data, 1)])
for index in range(len(mark) - 1):
data_n = data[mark[index] + 1:mark[index + 1], :]
tmax[index, :] = np.nanmax(data_n, axis=0) # 逐年逐站极端高温
# 逐年逐站高温出现的初日
for col in range(3, np.size(data_n, 1)):
for day in range(np.size(data_n, 0)):
if data_n[day, col] >= 35:
day_begin[index, col] = day
break
# 逐年逐站高温出现的终日,思路:逆序第一个大于35的日数就是终日
for col in range(3, np.size(data_n, 1)):
for day in range(np.size(data_n, 0) - 1, 0, -1):
if data_n[day, col] >= 35:
day_end[index, col] = day
break
# 逐年逐站最长连续高温日数
for col in range(3, np.size(data_n, 1)):
ht_begin = [0] # 初始值赋为0,避免全年无高温日数导致的计算错误
ht_end = [0]
day = 0
while day < np.size(data_n, 0):
if data_n[day, col] < 35:
day += 1
else:
ht_begin.append(day)
while data_n[day + 1, col] >= 35:
day += 1
else:
ht_end.append(day)
day += 1
max_htdays[index, col] = np.max(np.array(ht_end) - np.array(ht_begin))
tmax = np.delete(tmax, [1, 2], axis=1)
max_htdays = np.delete(max_htdays, [1, 2], axis=1)
max_htdays[:,0] = range(1961,2021)
day_begin[:, 0] = range(1961, 2021)
day_end[:, 0] = range(1961, 2021)
day_begin = np.delete(day_begin, [1, 2], axis=1)
day_end = np.delete(day_end, [1, 2], axis=1)
计算逐站逐年极端高温;逐年逐站高温出现的初日和终日;最长连续高温
最新推荐文章于 2024-08-07 17:42:24 发布