python应用之小麦生育期气象因子计算——基于pandas库

news2024/9/29 18:49:26

背景

本次介绍一下python的pandas包操作Excel(或者CSV等),应用情景是计算不同站点小麦多年生育期内的气象因子的特征(积温、降雨、辐射等)

主要涉及以下知识点:

  • 儒略日转换
  • 数据框值获取与字符串加法
  • 基于query函数的特定日期范围数据筛选
  • 数据框在循环中的追加
  • 数据框合并

数据样例

首先是气象站点数据,里面主要使用生育期信息,生育期是以儒略日(即这一年的第几天)形式,且假定每年不变
气象站点信息
然后利用气象站点的生育期对每年小麦生育期内的气象数据进行汇总,而难点就是得到小麦生育期内的时间序列和筛选此时间序列内的数据

这里面的数据主要是温度降雨以及辐射等信息

计算指标

计算的指标如下:

温度指标:

0以上积温:生育期大于0摄氏度温度累加

最冷月平均最低气温:月平均最低气温

最冷月平均气温:月平均气温

极端最低气温:生育期最低气温

平均气温:生育期平均气温

降水指标:

平均湿润度:生育期平均湿润度 单日湿润度:k=P/ET0 降水/蒸散

总降水量:生育期总降水量

光照指标:

总日照时数:生育期总日照时数

太阳总辐射(RS):生育期总太阳辐射

时间序列为1990-2020每时间作为一个节点进行统计分析

计算过程

这里操作Excel主要使用pandas这个库,首先转换儒略日为日期,这里主要涉及根据这一年的天数推算日期

from datetime import datetime


def jd_to_time(time):
  """
  time示例2020213
  """
    year = int(time[:4])
    day = int(time[4:])
    if day > 365:
        day = day - 365
        year += 1
        time = str(year) + str(day)        
    dt = datetime.strptime(time, '%Y%j').date()
    fmt = '%Y/%m/%d'
    return dt.strftime(fmt)

读取生育期,这里要注意的是CSV文件出现中文时编码格式多为国标的gb2312编码格式,所以读取的时候要标注。转换生育期为日期,主要涉及字符串的加减、依据变量信息的数据筛选

pheno = pd.read_csv(r'E:\科研材料\试验数据\指标计算张佳笑\气象站点对应生育期.csv', encoding = 'gb2312')
for site in pheno.station_name:
    for i in range(1990, 2020): 
        star_date = jd_to_time(str(i) + str(*pheno.query("station_name == @site")['播种日期'].values))
        end_date = jd_to_time(str(i+1) + str(*pheno.query("station_name == @site")['收获日期'].values))

然后获取小麦生育期内的数据,涉及日期的转换、query多条件筛选、日期的筛选

data = pd.read_csv(r'E:\科研材料\试验数据\指标计算张佳笑\ET0过程数据含Rs.csv', encoding = 'gb2312')
data['date'] = pd.to_datetime(data['date'])  # 日期转为日期格式
for site in pheno.station_name:
    wheat_data = data.query("StationName == @site & date > datetime.strptime(@star_date, '%Y/%m/%d') \
                                & date < datetime.strptime(@end_date, '%Y/%m/%d')")

这关键的两步完成之后就可以对小麦生育期之内的数据进行计算,先按照地点循环,循环内再循环年,之后按照每十年进行统计与数据合并,整体代码如下:

# 每十年进行统计
# 生育期内指标计算
import pandas as pd 
from datetime import datetime


def jd_to_time(time):
    year = int(time[:4])
    day = int(time[4:])
    if day > 365:
        day = day - 365
        year += 1
        time = str(year) + str(day)        
    dt = datetime.strptime(time, '%Y%j').date()
    fmt = '%Y/%m/%d'
    return dt.strftime(fmt)


data = pd.read_csv(r'E:\科研材料\试验数据\指标计算\气象数据.csv', encoding = 'gb2312')
data['date'] = pd.to_datetime(data['date'])
pheno = pd.read_csv(r'E:\科研材料\试验数据\指标计算\气象站点对应生育期.csv', encoding = 'gb2312')
final = []  # 储存最终结果
for site in pheno.station_name:
    result = {}  # 储存指标计算结果
    df = []  # 储存所有年份结果
    for i in range(1990, 2020): 
        star_date = jd_to_time(str(i) + str(*pheno.query("station_name == @site")['播种日期'].values))
        end_date = jd_to_time(str(i+1) + str(*pheno.query("station_name == @site")['收获日期'].values))
        wheat_data = data.query("StationName == @site & date > datetime.strptime(@star_date, '%Y/%m/%d') \
                                & date < datetime.strptime(@end_date, '%Y/%m/%d')")
        result['年份'] = i+1
        result['大于0积温'] = wheat_data.query("meantem > 0")['meantem'].sum()
        result['极端最低气温'] = wheat_data['mintem'].min()
        result['最冷月平均气温'] = wheat_data.groupby(by = ['month']).mean()['meantem'].min()
        result['最冷月平均最低气温'] = wheat_data.groupby(by = ['month']).mean()['mintem'].min()
        result['生育期平均气温'] = wheat_data['meantem'].mean()
        result['平均湿润度'] = wheat_data['k'].mean()
        result['总降水量'] = wheat_data['rain'].sum()
        result['总日照'] = wheat_data['sunhours'].sum()
        result['太阳总辐射'] = wheat_data['Rs'].sum()
        df.append(result.copy())
    site_year = pd.DataFrame(df)  # 位点所有年份结果
    site_year.dropna(inplace=True)  # 去除空值
    # 按照每时间进行分析
    stage1 = site_year.query("年份 > 1990 & 年份 < 2001").mean()
    stage1['年份'] = 1
    stage2 = site_year.query("年份 > 2000 & 年份 < 2011").mean()
    stage2['年份'] = 2
    stage3 = site_year.query("年份 > 2010").mean()
    stage3['年份'] = 3
    stage_merge = pd.concat([stage1, stage2, stage3], axis=1)
    stage_merge.columns =[site, site, site]  # 使列名变为站点名
    final.append(stage_merge)  # 融合所有数据
pd.concat(final, axis=1).to_excel(r'E:\科研材料\试验数据\指标计算\生育期内指标总.xlsx')

结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.md文件转.pdf文件

一、安装VS code vscode是一个轻量级的、可扩展性十分强的开发编辑器。过程略&#xff0c;比较简单。 二、安装插件Markdown PDF 直接 install 就可以了。 我这里出现了安装失败的情景&#xff0c;这时候可以通过它给的提示&#xff0c;安转markdown-pdf 的 .vsix 文件&#…

数据分析与SAS学习笔记2

SAS在企业使用的情况&#xff1a; SAS是一个很昂贵的商业软件。在企业中使用SAS比较多&#xff0c;在企业界中是比较流行&#xff0c;在学术界使用R比较多。 SAS简介&#xff1a;统计分析系统 处理生物分析数据。 SAS成为统计领域的国际标准软件&#xff0c;服务全球50000多家…

顶象业务安全大讲堂全新升级,挖洞大神喊你来get 挖洞秘籍啦!

CSDN直播间&#xff1a; 红队外网打点与情报收集策略——「业务安全大讲堂第二季第1期」https://live.csdn.net/room/dingxiangtech/rBN4xrOp 顶象业务安全大讲堂第二季将于2月23日重磅回归&#xff0c;本季业务安全大讲堂继续以业务安全为主题&#xff0c;为大家带来业务安全…

网络渗透之信息搜集

网络渗透之信息搜集一、信息搜集1.1 概念1.2 分类1.3 收集那些信息二、域名信息收集2.1 域名介绍2.2 域名分类2.3 域名信息查询- whois2.3.1 whois2.3.2 whois查询2.3.3 whois查询方法2.4 域名信息收集-备案信息三、子域名信息收集四、IP地址信息收集4.1 IP反查域名4.2 域名查询…

UVa 1343 The Rotation Game 旋转游戏 IDA* BFS 路径还原

题目链接&#xff1a;The Rotation Game 题目描述&#xff1a; 给定二十四个整数&#xff0c;这二十四个整数由八个一&#xff0c;八个二&#xff0c;八个三组成&#xff0c;从左到右&#xff0c;从上到下依次描述下图方格中的数字&#xff1a; 例如上图左边对应的输入就是[1,…

Java中List排序的3种方法!

引用&#xff1a;https://blog.csdn.net/sinat_32849897/article/details/122098256 在某些特殊的场景下&#xff0c;我们需要在 Java 程序中对 List 集合进行排序操作。比如从第三方接口中获取所有用户的列表&#xff0c;但列表默认是以用户编号从小到大进行排序的&#xff0c…

acwing 2 普通背包 2维做法的坑

背包问题应该都挺熟了&#xff0c;但还是放一下题目 无论是一维还是二维的解法&#xff0c;思路都比较一致&#xff0c;就是用一个二维的dpdpdp矩阵&#xff0c;dp[i][j]dp[i][j]dp[i][j] 的定义为前 iii 个元素的最优组合在容量为 jjj 的背包的最大价值。 这个定义非常的巧妙…

前缀和-蓝桥杯

一、前缀和的概念数组a[0]~ a[n-1]&#xff0c;前缀和sum[i]等于a[0] ~ a[i]的和:sum[0] a[0]sum[1] a[0] a[1]sum[2] a[0] a[1] a[2] ......在O(n)时间内求所有前缀和: sum[i] sum[i-l] a[i]a[0]一般不用。二、前缀和与区间问题预计算出前缀和&#xff0c;能快速计算出区…

C语言结构体(初阶)声明、初始化、成员访问、传参

目录结构体类型的声明结构体变量的定义和初始化结构体成员访问结构体传参1.结构体类型的声明//1. struct Book {char name[20];int price; //成员列表 }b3,b4,b5;//全局变量 int main() {struct Book b1;//b1,b2局部变量struct Book b2;return 0; }//2. struct Book {char n…

重磅!ChatGPT席卷全球,Salesforce将推出EinsteinGPT!

2月9日&#xff0c;Salesforce首席执行官Marc Benioff在Twitter上发布了这样一则推文&#xff0c;表示将于3月7日的TrailblazerDX 23上发布Salesforce EinsteinGPT&#xff0c;随后Salesforce的官方Twitter也进行了转发。 虽然还没有正式的新闻稿&#xff0c;但不少业内人士猜测…

C++【模板初阶】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 No one saves us but ourselves, no one can and no one may. We ourselves must walk the path. 除了我们自己&#xff0c;没有人能拯救我们&#xf…

FreeRTOS-Tickless低功耗模式 | FreeRTOS十四

目录 说明&#xff1a; 一、低功耗模式简介 1.1、STM32低功耗模式 二、Tickless模式 2.1、Tickless模式如何功耗 2.2、Tickless模式设计思想 2.3、为了降低功耗&#xff0c;又不影响系统运行&#xff0c;怎么能做到呢&#xff1f; 三、Tickless模式修改配置 3.1、配置…

如何提升 ETF 期权隐含波动率和希腊值的计算速度?

期权的隐含波动率可以反应市场对未来的预期&#xff0c;通常使用牛顿法和二分法来计算。这两种方法都需要频繁迭代&#xff0c;且迭代次数不能确定&#xff0c;核心代码无法向量化&#xff0c;因此只能通过循环来逼近求解。这就导致在期权相关计算中&#xff0c;隐含波动率往往…

PO模式在Selenium中简单实践

初识PO模式 PO&#xff08;PageObject&#xff09;是一种设计模式。简单来说就是把一些繁琐的定位方法、元素操作方式等封装到类中&#xff0c;通过类与类之间的调用完成特定操作。 PO被认为是自动化测试项目开发实践的最佳设计模式之一。 在学习PO模式前&#xff0c;可以先…

InstructGPT笔记

一、InstructGPT是在GPT3上微调&#xff0c;ChatGPT是在GPT3.5上微调 二、该论文展示了怎么样对语言模型和人类意图之间进行匹配&#xff0c;方法是在人类的反馈上进行微调。 **三、方法简介&#xff1a;**收集很多问题&#xff0c;使用标注工具将问题的答案写出来&#xff0…

大数据面试题flume篇

1.Flume 的Source&#xff0c;Sink&#xff0c;Channel 的作用&#xff1f;你们Source 是什么类型&#xff1f; 1. 作用 &#xff08;1&#xff09;Source组件是专门用来收集数据的&#xff0c;可以处理各种类型、各种格式的日志数据&#xff0c;包括 avro、thrift、exec、jm…

Nginx介绍及安装(windows版,Linux版)

目录 一、Nginx介绍 1、Nginx优势 2、Nginx作用 3、部署静态资源 4、代理 5、负载均衡 二、Nginx安装步骤&#xff08;windows版&#xff09; 三、Nginx安装步骤&#xff08;Linux版&#xff09; 1、官网下载安装包&#xff0c;下载完之后上传到Linux系统上 2、在Lin…

股票量化策略是如何被执行出来的?

在股票量化方面&#xff0c;很多投资者是不知道怎么样挖掘量化策略&#xff0c;便在量化交易接口方面会通过股票交易接口将数据慢慢挖掘出来&#xff0c;就简单的通过api接口调用数据方面&#xff0c;直接通过交易接口端输出交易持仓数据&#xff0c;并且通过交易系统对数据的筛…

什么是“镜像浏览”?文件夹加密后的镜像浏览有什么用?

电脑中的文件夹经常用来储存各种重要文件&#xff0c;加密保护成为很多人的选择&#xff0c;而夏冰加密软件拥有各种适用于不同场景的文件夹加密软件&#xff0c;备受用户喜爱。在我们打开加密文件夹之后&#xff0c;我们可以在加密控制面板中发现“镜像浏览”的按钮&#xff0…

Sharding-jdbc

一、概念理解垂直切分&#xff1a;包含垂直分库和垂直分表1.1、垂直分库 &#xff1a;专库专用&#xff08;按照业务类型对表分类&#xff09;1.2、垂直分表&#xff1a;基于数据表的列&#xff08;字段&#xff09;为依据切分的&#xff0c;是一种大表拆小表的模式。1.3、垂直…