将时间限制的变量数据分配到SAS

时间:2015-11-13 15:08:41

标签: sas

我试图弄清楚如何在SAS中执行以下操作。我每分钟都有一台NO2传感器拍摄的数据。 GPS正在记录每秒给定或占用的位置。我需要将每分钟的每个数据记录的值分配给过去一分钟的前一秒。记录的NO2数据是前一分钟的平均值。

以下是我的数据示例:Sample Data

我希望从最后一行(NO2,湿度,温度)" up"到具有GPS读数的前一分钟的秒数。该列格式为DateTime

会喜欢关于如何做到这一点的任何指示......提前致谢!

3 个答案:

答案 0 :(得分:1)

不幸的是,你的问题有点不清楚。假设您想要在最后一分钟(60秒)内为所有缺失值追溯分配NO2,湿度和温度,您可以执行以下操作:

虚拟数据:

data input ;
  format datetime datetime20. ; 
  datetime='28SEP2015:07:21:26'dt ;
    do i=1 to 120 ;
      datetime+1 ;
      if      i=80  then do ; no2=0.007 ; humidite=55.9 ; temperature=22.4 ; end ;
      else if i=120 then do ; no2=0.020 ; humidite=65.0 ; temperature=23.5 ; end ;
      else call missing(no2, humidite,temperature) ;
      output ;
    end ;
run ;

<强>解决方案:

仅保留包含值的关键记录:

data key(rename=(datetime=keytime))  ;
  set input(where=(nmiss(no2,humidite,temperature) ne 3));
run ;

将原始数据上的密钥记录作为哈希表运行:

data output(drop=rc rd i keytime)  ;
  *Load key table into memory ;
  if _n_=1 then do ;
    declare hash pt(dataset:"key",multidata:"yes",ordered:"yes");
    declare hiter iter('pt');
    rc=pt.defineKey('id');
    rc=pt.defineData('keytime','no2','humidite','temperature');
    rc=pt.defineDone();
  end ;

  *Read in original data ;
  set input ;
  rc=pt.find() ;

  *Update with key table values whenever needed ;
  if rc=0 then do ;
    rd=iter.first() ;
    if datetime gt keytime then rd=iter.next();
    if rd=0 and keytime-60 <= datetime <= keytime then output ;
    else do ;
      call missing(no2,humidite,temperature);
      output ;
    end;
  end ;
run; 

答案 1 :(得分:0)

听起来你有两个数据源。每分钟产生一次观察。另一个经常每秒产生一次观察。您希望将两个数据集连接在一起,以便给定分钟内的所有经常采样的值获得与该分钟对应的相同的偶然采样值。

假设NO2样本确实是每分钟并且具有NO2_TD的时间值,并且GPS时间戳是&#34; GPS_TD&#34; [具有与函数,信息和格式相同的变量通常是一个坏主意]。连接表的最佳方法之一是通过SQL。做一个完整的外部联接保证如果我们在任何一方都缺少数据,我们仍然可以从其他数据源获得观察结果。

PROC SQL ;
  CREATE TABLE joined_data AS
    SELECT a.*, b.NO2_MSR, b.NO2_TD
      FROM gps_data a
           FULL OUTER JOIN
           no2_data b
             ON INTNX('DTMINUTE',a.GPS_TD,0,'B') EQ INTNX('DTMINUTE',b.NO2_DT,0,'B')
  ;
QUIT ;

这里我们使用INTNX基本上忽略秒。我们将日期时间值移动到分钟边界(DTMINUTE),0分钟,到分钟的开头,基本上截断了连接目的的秒数。 INTNX非常常用于获得本月的第一天,月末,等等。

答案 2 :(得分:0)

如果只需要回填“时间排序”的环境数据而不考虑gps和环境数据采样之间的时间长度,那么下面的代码模式(基于Bendy的虚拟数据创建代码)应该足够了。

/* assuming input data is sorted by datetime value */
/* based on dummy data created with Bendy's code */ 
data fill_missing;
* read in the data but only keep the gps data - need to add lat and long to keep statement;
set input(keep=i datetime); 

if _n_=1 or datetime > datetime2 then do;
    drop datetime2; * drop the datetime value associated with the non-gps data ;
    * read only the rows that have the non-missing data using this set statement ;
    * and only keep the datetime (renamed to datetime2) and the non-gps data ;
    set input(keep=datetime no2 humidite temperature 
                rename=(datetime=datetime2)
                where=(no2 ne .));
end;
run;

另请注意,当输入数据的日期时间值超过与非缺失环境数据(非gps)关联的最大日期时间值时,此代码模式将停止输出数据。听起来这可能不是您的使用问题。