ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 行业案例 > 其他行业 > 如何完成气象统计部门对降雨资料的线性插值

如何完成气象统计部门对降雨资料的线性插值

作者:绿色风 分类: 时间:2022-08-18 浏览:189
楼主
yjzstar
Q:原始降雨资料比较混乱如已知:
               降雨开始时间           降雨结束时间              降雨量
              1956-6-2 4:42:00         1956-6-2 8:00:00                       17
现在要求转换成如下形式:
            开始时间                结束时间        降雨量
            1956-6-2 4:00:00   1956-6-2 5:00:00             ?
                     1956-6-2 5:00:00   1956-6-2 6:00:00             ?
                     1956-6-2 6:00:00   1956-6-2 7:00:00             ?
                     1956-6-2 7:00:00   1956-6-2 8:00:00             ?
这样就涉及到时间段内降雨是如何分布的,由于具体如何分布未知,所以假设降雨是平均的,即:降雨量除以时间间隔即为每分钟降雨量一定,比如:从1956-6-2 4:42:00        到 1956-6-2 8:00:00是198分钟,在这段时间内降雨量是17,那么每分钟降雨量是17/198=0.086,所以从1956-6-2 4:00:00 到1956-6-2 5:00:00 降雨量是18(分钟)*0.086,同理,1956-6-2 5:00:00到1956-6-2 6:00:00是0.086*60(分钟),1956-6-2 6:00:00到1956-6-2 7:00:00 类似可得。

A:因为原始数据的数据量较大,进行时间转化之后有40多万行,所以这里通过两个步骤来对这一问题进行求解:
步骤一:规范原始数据,将时间按每小时进行划分(此过程不建议用VBA实现,而是通过基础操作实现,因为两个过程都用VBA运行速度会非常慢)具体操作看动画:

 
公式说明:
N3=N2+0.0416666666642413
02=N2+0.0416666666642413
按照表中的时间格式一小时数值形式为0.0416666666642413,所以产用上面的公式;
填充的终止值为433080,2005年10月28-1956年6月2日为18045天,即为433080小时,所以产用这个终止值,填充是为了公式的快速填充!
这个方法比较灵活,不必担心VBA程序出错!
步骤二:
经过以上操作之后时间格式以及完全符合规范,下面就可以直接通过VBA来进行降雨量的线性插值,具体VBA代码如下:
  1. Sub xx()
  2. Dim n, n1, bb, x, x1 As Double
  3. Dim i As Integer
  4. Dim j As Long
  5. Dim rng As Range
  6. Dim rng1 As Range
  7. Dim nn As Integer
  8. Set rng = [B2] '原始数据降雨开始时间
  9. Set rng1 = [M2] '整理后降雨开始时间的开始单元格,按照动画请改成【N2】
  10. i = 0
  11. j = 0
  12. nn = Cells(Rows.Count, 1).End(xlUp).Row
  13. line: Do
  14.     n = CDbl((CDate(LTrim(rng.Offset(i, 1).Value))) - CDate(LTrim(rng.Offset(i, 0).Value)))
  15.     x = rng.Offset(i, 2).Value / n
  16.     If CDate(LTrim(rng1.Offset(j, 0))) >= CDate(LTrim(rng.Offset(i, 1))) Then '没有重合
  17.         If CDate(LTrim(rng1.Offset(j, 1))) <= CDate(LTrim(rng.Offset(i + 1, 0))) Then
  18.             rng1.Offset(j, 2) = 0
  19.             j = j + 1
  20.             GoTo line
  21.         End If
  22.         i = i + 1
  23.    
  24.     Else
  25.         If CDate(LTrim(rng1.Offset(j, 0))) >= CDate(LTrim(rng.Offset(i, 0))) Then
  26.             If CDate(LTrim(rng1.Offset(j, 1))) <= CDate(LTrim(rng.Offset(i, 1))) Then '完全包含
  27.                 rng1.Offset(j, 2) = 60 * x / 1440
  28.                 j = j + 1
  29.             Else       '右交叉
  30.                 If CDate(LTrim(rng1.Offset(j, 1))) > CDate(LTrim(rng.Offset(i + 1, 0))) Then
  31.                     n1 = CDbl((CDate(LTrim(rng.Offset(i + 1, 1).Value))) - CDate(LTrim(rng.Offset(i + 1, 0).Value)))
  32.                     x1 = rng.Offset(i + 1, 2).Value / n1
  33.                     bb = (CDbl(CDate(LTrim(rng1.Offset(j, 1).Value)) - CDate(LTrim(rng.Offset(i + 1, 0).Value)))) * x1
  34.                     rng1.Offset(j, 2) = (CDbl(CDate(LTrim(rng.Offset(i, 1).Value)) - CDate(LTrim(rng1.Offset(j, 0).Value)))) * x + bb
  35.                 Else
  36.                    rng1.Offset(j, 2) = (CDbl(CDate(LTrim(rng.Offset(i, 1).Value)) - CDate(LTrim(rng1.Offset(j, 0).Value)))) * x
  37.                 End If
  38.                
  39.                 j = j + 1
  40.             End If
  41.         Else
  42.             If CDate(LTrim(rng1.Offset(j, 1))) <= CDate(LTrim(rng.Offset(i, 1))) Then '左交叉
  43.                 rng1.Offset(j, 2) = (CDbl(CDate(LTrim(rng1.Offset(j, 1).Value)) - CDate(LTrim(rng.Offset(i, 0).Value)))) * x
  44.                 j = j + 1
  45.             Else
  46.                 If CDate(LTrim(rng1.Offset(j, 1))) >= CDate(LTrim(rng.Offset(i + 1, 1))) Then
  47.                     rng1.Offset(j, 2) = rng.Offset(i, 2) + rng.Offset(i + 1, 2)  '双完全包含
  48.                 Else
  49.                     rng1.Offset(j, 2) = rng.Offset(i, 2) '另一种单包含
  50.                 End If
  51.                 j = j + 1
  52.             End If
  53.         
  54.         End If
  55.     End If
  56. Loop Until i = nn - 2
  57. End Sub
注意代码8,9两行的SET,请根据你自己的降雨数据进行填写,rng为原始数据的降雨开始时间的第一个有效数据地址,即这里的 1956-6-2  4:42:00;rng1为处理规范之后的降雨开始时间,这里为1956-6-2  4:00:00。
改过程运行时间大概为1-2分钟,已满足实际应用需要!
另外,这个文档不适合03版的使用,因为数据行已经大大超出了03版的行数!
本人VBA知识皮毛,基本语句掌握的还行,如有问题欢迎指正!
平原典型站降雨资料22.zip
2楼
liwei20062010
顶****
3楼
vanesshuan
速度太快了,看的不是很明白
4楼
lrlxxqxa
5楼
jianzhanchou
bucuo
6楼
芐雨
谢谢分享

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap