计算逐站逐年极端高温;逐年逐站高温出现的初日和终日;最长连续高温

# -*- 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)
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值