爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5841|回复: 16

王老师,求助! 处理micaps数据中关于时间名的设置

[复制链接]

新浪微博达人勋

发表于 2014-3-17 17:23:57 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 wuwei2163 于 2014-3-17 17:35 编辑

王老师,你好!最近我也遇到相似的问题,研究“MeteoInfo脚本示例:MICAPS第4类数据转为NetCDFhttp://bbs.06climate.com/forum.php?mod=viewthread&tid=11630&fromuid=22069”
这个帖子也很久了,由于我的数据上时间和上面的不太一样,关于时间的设置还是不会改的,请求王老师帮帮忙,比较急用!!!

                               
登录/注册后可看大图


这是你之前编写的处理micaps多层次多时间数据的程序,简单的改了一下,求教关于数据名上的时间怎么改,麻烦您了
#--------------------------------------------------------
# Author: Yaqiang Wang
# Date: 2012-12-11
# Purpose: Convert MICAPS 4 grid data to NetCDF data format
# Note: Sample
#-----------------------------------------------------------
import clr
clr.AddReferenceByPartialName("System.Windows.Forms")
clr.AddReferenceByPartialName("System.Drawing")
from System import *
from System.Windows.Forms import *
from System.Drawing import *
clr.AddReference("MeteoInfoC.dll")
from MeteoInfoC import *
from MeteoInfoC.Data import *
from MeteoInfoC.Data.MeteoData import *

import os.path
import datetime
import time

#---- Set data folder
dataDir = "y:\\ecmwf\\R\\"

#---- Open a MICAPS 4 Data file to get the information
inDataInfo = MeteoDataInfo()
infile = dataDir + "1000\\14031708.000"
inDataInfo.OpenMICAPSData(infile)
undef = inDataInfo.UNDEF
lons = inDataInfo.GetX()
lats = inDataInfo.GetY()
lonNum = lons.Length
latNum = lats.Length
ls = [1000, 925, 850, 700, 500, 300, 100]
levelNum = len(ls)
levels = Array.CreateInstance(Double, levelNum)
i = 0
for l in ls:
        levels = l;
        i += 1

#---- Create netCDF data info object
outfilepath = "D:\\" + "test.nc"
outDataInfo = NetCDFDataInfo()
outDataInfo.fileName = outfilepath
outDataInfo.UNDEF = undef
outDataInfo.unlimdimid = 3

#---- Add dimensions: lon, lat, level, time
lonDim = outDataInfo.AddDimension("lon", lonNum)
latDim = outDataInfo.AddDimension("lat", latNum)
levelDim = outDataInfo.AddDimension("level", levelNum)
timeDim = outDataInfo.AddDimension("time", -1)

#---- Add variables
outDataInfo.AddVariable("lon", NetCDF4.NcType.NC_DOUBLE, Array[Dimension]([lonDim]))
outDataInfo.AddVariable("lat", NetCDF4.NcType.NC_DOUBLE, Array[Dimension]([latDim]))
outDataInfo.AddVariable("level", NetCDF4.NcType.NC_DOUBLE, Array[Dimension]([levelDim]))
outDataInfo.AddVariable("time", NetCDF4.NcType.NC_DOUBLE, Array[Dimension]([timeDim]))
outDataInfo.AddVariable("temadv", NetCDF4.NcType.NC_DOUBLE, Array[Dimension]([timeDim, levelDim, latDim, lonDim]))
#---- Add variable attributes
outDataInfo.AddVariableAttribute("lon", "units", "degrees_east")
outDataInfo.AddVariableAttribute("lon", "long_name", "longitude")
outDataInfo.AddVariableAttribute("lat", "units", "degrees_north")
outDataInfo.AddVariableAttribute("lat", "long_name", "latitude")
outDataInfo.AddVariableAttribute("level", "units", "level");
outDataInfo.AddVariableAttribute("level", "long_name", "level");
outDataInfo.AddVariableAttribute("level", "axis", "z");
outDataInfo.AddVariableAttribute("time", "units", "hours since 1800-1-1 00:00:00")
outDataInfo.AddVariableAttribute("time", "long_name", "time")
outDataInfo.AddVariableAttribute("temadv", "units", "No")
outDataInfo.AddVariableAttribute("temadv", "long_name", "TemperatureAdvection")
outDataInfo.AddVariableAttribute("temadv", "missing_value", undef)

#---- Add global attributes
outDataInfo.AddGlobalAttribute("title", "Temperature advection field data")
outDataInfo.AddGlobalAttribute("description", "script sample data")

#---- Create netCDF file
outDataInfo.CreateNCFile(outfilepath)

#---- Write lon, lat, level, time data
outDataInfo.WriteVar("lon", lons)
outDataInfo.WriteVar("lat", lats)
outDataInfo.WriteVar("level", levels)

timeArray = Array.CreateInstance(Double, 8)
times = []
st = datetime.datetime(1800, 1, 1, 0, 0, 0)
t = datetime.datetime(2014, 03, 17, 8, 0, 0)        
for i in range(0, 9):        
        times.append(t)
        delta = t - st
        hours = (delta.days * 86400 + delta.seconds) / 3600.0
        t = t + datetime.timedelta(hours=12)
        timeArray = hours
        print timeArray

startArray = Array.CreateInstance(int, 1)
countArray = Array.CreateInstance(int, 1)
startArray[0] = 0
countArray[0] = len(times)
outDataInfo.WriteVara("time", startArray, countArray, timeArray)

#---- Write data
tidx = 0
for t in times:
        lidx = 0
        for l in ls:
                infile = dataDir + str(l) + "\\" + t.strftime("%y%m%d%H") + ".000"
                print infile
                if os.path.isfile(infile):
                        print infile
                        inDataInfo.OpenMICAPSData(infile)
                        gdata = inDataInfo.GetGridData("var")
                        dataArray = gdata.ToOneDimData()        
                        startArray = Array.CreateInstance(int, 4)
                        countArray = Array.CreateInstance(int, 4)
                        startArray[0] = tidx
                        startArray[1] = lidx
                        startArray[2] = 0
                        startArray[3] = 0
                        countArray[0] = 1
                        countArray[1] = 1
                        countArray[2] = latDim.DimLength
                        countArray[3] = lonDim.DimLength
                        outDataInfo.WriteVara("temadv", startArray, countArray, dataArray)
                lidx += 1
        tidx += 1

#---- Close netCDF file
outDataInfo.CloseNCFile()

print 'Finished...!'

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-17 22:17:39 | 显示全部楼层
脚本里datetime相关代码就是设置时间的。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-3-18 10:31:12 | 显示全部楼层
王老师,你好!关于修改时间的程序我也研究了,但是对于这样的预报数据比如14031708.000、14031708.003、14031708.006等等还是不太懂,下面的是关于时间设置的一段程序,请王老师帮忙看一下
timeArray = Array.CreateInstance(Double, 8)
times = []
st = datetime.datetime(1800, 1, 1, 0, 0, 0)
t = datetime.datetime(2014, 03, 17, 8, 0, 0)        
for i in range(0, 9):        
        times.append(t)
        delta = t - st
        hours = (delta.days * 86400 + delta.seconds) / 3600.0
        t = t + datetime.timedelta(hours=12)
        timeArray = hours
        print timeArray
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-18 11:10:41 | 显示全部楼层
本帖最后由 MeteoInfo 于 2014-3-18 11:13 编辑
wuwei2163 发表于 2014-3-18 10:31
王老师,你好!关于修改时间的程序我也研究了,但是对于这样的预报数据比如14031708.000、14031708.003、14 ...

你的数据预报时次的间隔是3小时:
t = t + datatime.timedelta(hours=3)
timeArray[ii] = hours
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-3-18 11:24:04 | 显示全部楼层
本帖最后由 wuwei2163 于 2014-3-18 11:40 编辑

王老师,其他时间的设置不需要改了吗,我之前也是这样改的,把12 hour改成了3 hour,其他地方没有变,但是运行有错啊
timeArray = Array.CreateInstance(Double, 8)  ----------这个(Double, 8 )是什么意思,不太清楚???
times = []
st = datetime.datetime(1800, 1, 1, 0, 0, 0)
t = datetime.datetime(2014, 03, 17, 8, 0, 0)        
for i in range(0, 9):        
        times.append(t)
        delta = t - st
        hours = (delta.days * 86400 + delta.seconds) / 3600.0
        t = t + datetime.timedelta(hours=3)
        timeArray = hours
        print timeArray看这个错误提示,还有其他错误
错误.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-18 11:58:22 | 显示全部楼层
wuwei2163 发表于 2014-3-18 11:24
王老师,其他时间的设置不需要改了吗,我之前也是这样改的,把12 hour改成了3 hour,其他地方没有变,但是运 ...

undef = inDataInfo.UNDEF
改为:
undef = inDataInfo.MissingValue
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-3-18 12:34:05 | 显示全部楼层
王老师,首先非常感谢您,对我们这些基层预报员的帮助,由于从未接触这门语言,所以要一次又一次的麻烦您,很过意不去,这次又出现的新的错误,不明白:相同的程序,同样的数据,为啥别人可以运行,我这错误一个接一个呢? 错误.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-18 12:45:12 | 显示全部楼层
wuwei2163 发表于 2014-3-18 12:34
王老师,首先非常感谢您,对我们这些基层预报员的帮助,由于从未接触这门语言,所以要一次又一次的麻烦您, ...

这不是你的问题,MeteoInfo类库在不断的更新,有些东西有变化,UNDEF属性已经改为了MissingValue,当然还有其它改变。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-3-18 13:07:15 | 显示全部楼层
MeteoInfo 发表于 2014-3-18 12:45
这不是你的问题,MeteoInfo类库在不断的更新,有些东西有变化,UNDEF属性已经改为了MissingValue,当然还 ...

那请问王老师,这个错误该怎么改??? 错误.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-18 13:50:04 | 显示全部楼层
wuwei2163 发表于 2014-3-18 13:07
那请问王老师,这个错误该怎么改???

前面不是说了吗
outDataInfo.UNDEF = undef
改为:
outDataInfo.MissingValue = undef
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表