av日韩亚洲,一本一本a久久,亚洲一区二区三区,亚洲一区二区三区免费视频

利用自定義函數處理兩個時間的差值和均值問題

來源:期刊VIP網所屬分類:水利時間:瀏覽:

  Abstract:This article gives a computer-defined function, descriptive the design mentality and the source code of the function process, expounds this method simplicity, versatility, easy operational and reliability, and introduce its service condition unified the application example.
  Keywords:hydrological data;time interpolation;time average;function;example
  摘 要: 本文給出一個計算機自定義函數,敘述了該函數過程的設計思路和源程序代碼,闡明了此方法的簡單性、通用性、易操作性和可靠性,并結合應用實例介紹了其使用情況。
  關鍵詞: 水文資料 時間差值和均值 函數 舉例
  中圖分類號:O174 文獻標識碼:A 文章編號:
  1問題的提出
  在工作實踐中,經常需要我們對一個時間段進行各類操作,比如計算兩個時間的歷時即差值,兩個時間的中間時間即均值。如果該差值是很小的,不難由人工直接計算這兩項數據,而在計算機進行運算和管理時卻變成了一個復雜的過程。因為,這兩個時間往往都是日期-時間型數據,各類軟件開發工具均未能直接給出它們的關系運算函數,或只是對日期和時間分別給出簡單的運算,實踐中遇到的跨日、跨月甚至跨年度的時間段的處理會給我們帶來更大難度。從水文測驗過程到水情拍報乃至資料整編,都常常遇到這一問題,給計算機處理帶來極大的不便。為此,筆者經過摸索和反復驗證,給出一個成熟可靠的自定義函數,調入計算機內存后便可靈活地對任意兩個日期——時間型數據進行操作。
  2自定義函數的設計
  2.1設計思路
  構造該函數過程,按不同的參數返回(Return)兩個不同結果,即時間差值和均值。該函數有5個參數,分別設定為第一時間的日期和時分dat1和tim1、第二時間的日期和時分dat2和tim2 ,控制函數返回差值或均值參數cs(Integer型),取1或0 ,于是給出函數型式Op_DateTime(dat1,tim1,dat2,tim2,cs)。比較出兩個日期-時間型數據的較小者,提取其中的年份并以該年份的1月1日00:00時為參照時間,如此就會最簡單地使用系統函數計算出兩個時間分別同這一參照時間的差值,換算為分鐘,則這兩個差值的差即為所求差值。將該差值除以2,按年月日時規則,通過循環數據結構控制累加到第一時間,即為所求均值。
  2.2函數源代碼(PowerScript腳本)
  //函數形式 Op_DateTime(dat1,tim1,dat2,tim2,cs)
  //返回值jisuan_date_time為 String 型
  //dat1、dat2為Date型,tim1、tim2為Time型, cs為Integer 型
  //cs = 1函數返回差值,否則返回均值
  //下面聲明程序使用的變量,考慮分鐘等數值過大,盡量使用Long和Decimal型
  Date dat,dat0
  Time tim
  Long tianshu1,tianshu2,ztime,xiaoshi,yue,tian,shi,fen
  Long jisuan_d jisuan_m,jisuan_y,i,m_2
  Dec fenzhong
  String jisuan_date_time = ""
  //如果給定的第一時間大于第二時間,則交換一下位置
  IF DateTime(dat1,tim1) > DateTime(dat2,tim2) THEN
  dat = dat1
  dat1 = dat2
  dat2 = dat
  tim = tim1
  tim1 = tim2
  tim2 = tim
  END IF
  dat0 = Date(Year(dat1),1,1) //虛擬第一時間年份的1月1日00:00時做參照時間
  tianshu1 = DaysAfter(dat0,dat1) //取得第一時間同參照時間的之間的天數
  tianshu2 = DaysAfter(dat0,dat2) //取得第二時間同參照時間的之間的天數
  //計算兩個時間之間總分鐘數
  ztime = tianshu2 * 1440 + Hour(tim2) * 60 + Minute(tim2)
  ztime = ztime - (tianshu1 * 1440 + Hour(tim1) * 60 + Minute(tim1))
  IF cs = 1 THEN
  jisuan_date_time = String(Ztime) //得到參數為1時的時間間隔(分鐘,String型)
  ELSE //參數不為1時,推算兩個時間的中值或叫均值
  jisuan_d = Day(dat1) //得到第一時間中的天數
  jisuan_m = Month(dat1) //得到第一時間中的月份
  jisuan_y = Year(dat1) //得到第一時間中的年度
  fenzhong = Minute(tim1) + Ztime/2
  i = 0
  DO UNTIL fenzhong <= 32766 //將分鐘變得足夠小,以便下邊能取Integer
  fenzhong = fenzhong - 32766 //并要保證分鐘整數部分原有的奇和偶
  i = i + 1
  LOOP
  IF fenzhong > Int(fenzhong) THEN //考慮逢5奇進偶舍
  IF Int(fenzhong)/2 = Int(Int(fenzhong)/2) THEN
  fenzhong = Int(fenzhong)
  ELSE
  fenzhong = Int(fenzhong) + 1
  END IF
  END IF
  fenzhong = fenzhong + 32766 * i
  fen = Mod(fenzhong,60) //取余數得到平均時間的分鐘值
  xiaoshi = Int(fenzhong/60) + Hour(tim1)
  shi = Mod(Dec(xiaoshi),24) //取余數得到平均時間的小時值
  tian = Int(xiaoshi/24) //取整數得到進位的天數
  IF tian > 0 THEN
  FOR i = 1 TO tian //按不同的月份和年份逐日進位
  CHOOSE CASE jisuan_m
  CASE 1,3,5,7,8,10,12
  IF jisuan_d < 31 THEN
  jisuan_d = jisuan_d + 1
  ELSE
  jisuan_d = 1
  IF jisuan_m = 12 THEN
  jisuan_m = 1
  jisuan_y = jisuan_y + 1
  ELSE
  jisuan_m = jisuan_m + 1
  END IF
  END IF
  CASE 2
  IF jisuan_y = Int(jisuan_y/4) * 4 THEN //考慮閏年情況
  m_2 = 29
  ELSE
  m_2 = 28
  END IF
  IF jisuan_d < m_2 THEN
  jisuan_d = jisuan_d + 1
  ELSE
  jisuan_d = 1
  jisuan_m = jisuan_m + 1
  END IF
  CASE ELSE
  IF jisuan_d < 30 THEN
  jisuan_d = jisuan_d + 1
  ELSE
  jisuan_d = 1
  jisuan_m = jisuan_m + 1
  END IF
  END CHOOSE
  NEXT
  END IF
  //按yyyy-mm-dd hh:mm格式計算取得平均時間結果,String型
  jisuan_date_time =jisuan_date_time + String(jisuan_y)
  IF jisuan_m < 10 THEN
  jisuan_date_time =jisuan_date_time + "-0" + String(jisuan_m)
  ELSE
  jisuan_date_time =jisuan_date_time + "-" + String(jisuan_m)
  END IF
  IF jisuan_d < 10 THEN
  jisuan_date_time =jisuan_date_time + "-0" + String(jisuan_d)
  ELSE
  jisuan_date_time =jisuan_date_time + "-" + String(jisuan_d)
  END IF
  IF shi < 10 THEN
  jisuan_date_time =jisuan_date_time + " 0" + String(shi)
  ELSE
  jisuan_date_time =jisuan_date_time + " " + String(shi)
  END IF
  IF fen < 10 THEN
  jisuan_date_time =jisuan_date_time + ":0" + String(fen)
  ELSE
  jisuan_date_time =jisuan_date_time + ":" + String(fen)
  END IF
  END IF
  RETURN jisuan_date_time //返回函數值,String型
  3自定義函數的應用
  3.1使用該函數應注意的問題
  從程序代碼可以看到,為最大限度滿足其通用性,一方面,該函數不論是對幾分鐘的短時間段,還是對幾年的長歷時,都能正確返回差值或均值。另一方面,在使用系統函數時,盡量兼顧各類程序語言。例如,PowerScript函數庫中的Ceiling(n)函數能夠返回大于數值型變量n的最小整數,但在這里沒有使用,而是使用的取整函數Int(),并對超出Integer型范圍的數進行了處理。在使用該函數時,除考慮不同軟件開發語言的差別外,還應注意以下幾點:一是該函數在計算均值時考慮了“四舍六入,逢五奇進偶舍”的原則,如果在實際應用中不需要這種處理,就直接應用系統的“四舍五入”(Round)函數。二是由于該函數是通過參數控制返回2個可選擇而且是不同類型的結果,因此,不論是差值還是均值都已經定義為字符型,那么返回的數據在使用時都須進行數據類型轉換。三是該函數操作和返回的數據均精確到分鐘,如果實際需要更精確,可通過增加循環控制來實現。
  3.2在實測流量、輸沙量管理系統中的應用實例
  該函數在筆者研制的實測流量、輸沙量管理系統中發揮了非常理想的作用,那就是在實測流量、輸沙量的計算過程中能獲取用戶輸入的起止2個施測時間,均為日期-時間型,由程序來取得平均施測時間以對應本次瞬時流量和輸沙量,并據此點繪流量和輸沙量過程線,推算日平均流量和輸沙率,為了輔助報汛,還計算出累計過水量和輸沙總量。如表1。
  表1                  30909999_2007-12-28流量(輸沙)過程
本次過水總量為:864.2(104m3),輸沙總量為:146(t)
施測(或內插)時間 流量施
測號數
水位
(m)
流量
(Q)
斷面平均
(含沙量)
輸沙率
(Qs)
歷時
(分鐘)
日平均
流量
日平均
輸沙率
年 月 日 時 分
2007-12-28 00:00
 

 
0 0 0 0 20.4 0
2007-12-28 15:29 111 9.88 30.5 0 0 929
 

 
2007-12-29 00:00
 

 
29.2 0 0 511 28.3 0.145
2007-12-29 15:42 112 9.95 27.8 0 0 942
 

 
2007-12-30 00:00
 

 
28.0 0.030 0.840 498 28.2 1.27
2007-12-30 15:13 113 9.98 28.3 0.060 1.70 913
 

 
2007-12-31 00:00
 

 
28.3 0.030 0.849 527 23.1 0.268
2007-12-31 15:10 114 9.98 28.3 0 0 910
 

 
2008-1-1 00:00
 

 
0 0 0 530
 

 
  實測流量、輸沙量成果表同過程線圖建立鏈接后,系統自動插入各日00:00時和24:00時的數據,按照連實測流量過程線法推流,可使用該自定義函數在任意兩個時間段內插入一個均值時間及相應的流量、輸沙量,再按照人為需要和過程線趨勢進行手工調整,直到取得滿意的過程線后實施相應的計算功能。該函數在計算各時段的歷時過程中,為該程序模塊取得了事半功倍的效果。
  4結語
  本文給出的這一函數,從思路到實現的過程都是嚴密的,全面考慮了各種情況,大量的實際應用更表明了該函數具有簡單性、通用性、易操作性和可靠性,而且作為自定義函數,調入計算機內存后同系統函數的運算效果是相同的,在此提供給廣大同仁及愛好者。當然,這只是筆者在水文資料電算中的一點經驗之談,不妥之處,敬請指正。

主站蜘蛛池模板: 武平县| 张掖市| 常德市| 闽侯县| 黎平县| 昌吉市| 东平县| 绵阳市| 陕西省| 大连市| 岚皋县| 确山县| 上蔡县| 苍南县| 长武县| 宜丰县| 耿马| 隆德县| 石台县| 潜江市| 游戏| 罗田县| 东丰县| 棋牌| 安徽省| 富平县| 新疆| 南江县| 石城县| 通海县| 太白县| 绿春县| 江津市| 砚山县| 石首市| 开平市| 乐清市| 环江| 昂仁县| 宁阳县| 太仆寺旗|