- 积分
- 6727
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-7-6
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 方自之 于 2017-9-1 08:12 编辑
写在前面:站点实测资料是气象常见的资料形式,日均和月均也是最基本的统计手段。大家都会有这样的经历:实测数据常会出现缺测值和缺失值,在统计日月平均时就很难写成一个简单的循环。本帖结合楼主自学经历,介绍通过datetime来做日平均的个例,希望大佬多多提意见。
任务:很简单,站点观测数据计算日平均。数据格式如图。 难点:数据缺失与缺测。数据缺失:并不是每天都是24个数据。数据缺测:某些时刻的数据显示缺测,值为‘9999’。
思路:读取数据时,我们读取日期这一列,形成以string为单位的一个list,与变量是完全对应的。这样我们用datetime建立一个时间循环2016/01/01、2016/01/02...再用读取的日期列去匹配这个时间循环,只要两个字符串相等(其实datetime不是字符串类型,需要转换),对应的气象要素就属于同一天。这样就避免了每天相加求平均的次数不是恒定值的问题。- start_day = datetime.datetime.strptime('2016/1/1 0:00', '%Y/%m/%d %H:%M')#设定起始时间
- for d in range(0,366):
- # firstly,we try to ues the fuction Datetime
- delta = datetime.timedelta(days=d) # 设定时间间隔
- end_day_1 = start_day + delta
- end_day = str(end_day_1) # 没有找到datetime的格式化函数,只好绕道用time的格式化办法
- timeArray = time.strptime(end_day, "%Y-%m-%d %H:%M:%S")
- otherStyleTime = time.strftime("%Y/%m/%d", timeArray)
- n = 0
- m = 0
- for i in range(0,len(day)):
- #the type of 'day' is 2016/1/1,but we wish that is same as otherstyletime,just like
- #2016/01/01.the fllowing code, we convert the type by using some fuction.
- vert_day = day[i].split('/')
- final_day= '%s/%02d/%02d' %(vert_day[0],int(vert_day[1]),int(vert_day[2]))
- if final_day == otherStyleTime:
复制代码
首先,我们用datetime.strptime()设定一个起始时间,输出一个内容为‘2016-01-01 00:00’的新类型,但我们需要的格式是字符串,形式为‘2016/1/1’。于是这里楼主用了些笨办法,走了些弯路。delta是时间间隔,这里设为一天,即d=365时,otherStyleTime=‘2016-12-31 00:00’。这个函数很好用,最小能设置一秒,还有很多时间计数法。由于没有找到如何把datetime改变格式的办法,就去调用了time.strftime(),但值得到了字符串‘2016/01/01’,离最终的‘2016/1/1’还有一步之遥,这时候可以利用python字符串的格式化%大法,改变otherStyleTime或day[:]。后面再具体计算每一天的和以及求日平均时,简单加一个计数器n就可以了。至于缺测值‘9999’,我知道numpy是有相关函数的,但我没有去查。我加判别条件跳过‘9999’。在计算极大值时,利用set()找到‘第二大值’。
讨论:1、python的特色就是包多,所以函数很多,虽然是个很基础的任务,但也可以找出很多又用的函数。2、python感觉和Fortran很大的不同就是对于字符串的处理,连读文件都是默认全是字符串。适应处理字符串变量,是学习python的必经之路。3、我看了看手头的资料,每一年的日期格式都是五花八门:2016/1/1、2013-01-01、20120101...也是醉了,和大家讨论如何很高效的处理有缺失和缺测的站点数据
|
-
数据示例
|