微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python的pandas计算5天滑动平均气温,并批量计算春季起始日

近期有个计算春天的需求,网上搜了下大多是用MATLAB中的smooth函数的思路写的。正好学到pandas几个强大的数据处理方法,想着自己试试.
pandas提供了大量能使我们快速便捷地处理数据的函数方法,什么深度学习,推荐,分类啊都挺好用。本次处理主要应用的就是窗口函数rolling,算滑动平均气温刚刚好。
**

1.数据准备

中国气象数据网上找的站点日平均气温,txt。为了方便,就取了站名、月、日、日平均气温。

2.相关概念


直接上图,因为描述起来怎么这么难。

我百度找的图

好吧,如此严格的标准,无限感叹何苦为难自己人啊~
(1)计算5天滑动平均气温T1
(2)滑动平均气温T1还得连续五天大于10°
(3)映射到9天有日平均气温的日子里找出第一个
如果还是看不懂,仔细阅读https://www.doc88.com/p-0723733695358.html (其实我也是百度学的)

3.来吧,代码

import os
import pandas as pd #引入pandas
import openpyxl 
import numpy as np

def window_springdate(path,filename):
    papa=pd.read_csv(os.path.join(path,filename),sep='\t',header=None,names=['site','month','day','TEM']) #加载papa.txt,指定它的分隔符是 \t   
    w = papa['TEM']#获得气温
    data1 = w.rolling(5,min_periods=1).mean()#计算5天滑动平均气温
    papa['data'] = data1
    papa['spring'] = papa['data'].rolling(5).agg(lambda x:min(x)>10)#滑动窗口为5天时候所有的5天滑动平均气温都高于10度
    print('写入excel')
    
    ss=filename.split('.')[0]
    newfile = os.path.join('D:\\test', "re_"+ss+".xlsx")#处理后的新文件
    print(newfile)
    print(ss)
    fp = open(newfile,'w')
    papa.to_excel(newfile,index=True)  
    a1 = papa.loc[papa['spring'] == 1]
    if not a1.empty:
        print('hahah')
        a = a1.iloc[0]
        print(a)
        b =pd.DataFrame(data=a)
        c = b.T
        return c
    else:
        print('winter')

因为处理的1-3月份的数据,条件那块没写的那么细。等算其他季节时候再说吧~~~~

DataFrame.rolling(window, min_periods=None, center=False, win_type=None, 
                  on=None, axis=0, closed=None)

rolling窗口函数可以直接用mean()求平均,sum() 值的总和,等等。好玩的是 agg ()函数可以快速实现多个聚类函数,并输出结果。代码示例里就用的这个换了个思路得到滑动平均气温连续5天大于等于10度的。
不过求得的a是series,换了个格式后,就能得到结果。

输出结果类似这样

接下来放到循环里,没了就这样,88

rootdir='D:\\offlinedata'
# read
for (dirpath,dirnames,filenames) in os.walk(rootdir):
    for filename in filenames:
        print('>>>>',filename)
        a = window_springdate(dirpath,filename)
        if a is None:
            print('cold')
            continue
        else:
            print(a)
            a.to_csv(r'C:\Users\nanch\Desktop\2.csv',line_terminator="\n",mode='a',encoding='utf8')
print('bye')     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐