将时间绑定变量数据分配到前一分钟';SAS中的秒数

将时间绑定变量数据分配到前一分钟';SAS中的秒数,sas,Sas,我正试图找出如何在SAS中执行以下操作。我每分钟都有NO2传感器采集的数据。GPS每秒记录一个位置。我需要将每分钟记录的每个数据的值分配到过去一分钟的前几秒。记录的NO2数据是前一分钟的平均值 以下是我的数据示例: 我希望把数据从最后一行(NO2,湿度,温度)“上升”到前一分钟有GPS读数的秒数。该列采用DateTime格式 想知道怎么做吗。。。提前谢谢 不幸的是,你的问题有点不清楚。假设您希望在最后一分钟(60秒)内为所有缺失值追溯分配NO2、湿度和温度,您可以执行以下操作: 虚拟数据: da

我正试图找出如何在SAS中执行以下操作。我每分钟都有NO2传感器采集的数据。GPS每秒记录一个位置。我需要将每分钟记录的每个数据的值分配到过去一分钟的前几秒。记录的NO2数据是前一分钟的平均值

以下是我的数据示例:

我希望把数据从最后一行(NO2,湿度,温度)“上升”到前一分钟有GPS读数的秒数。该列采用
DateTime
格式


想知道怎么做吗。。。提前谢谢

不幸的是,你的问题有点不清楚。假设您希望在最后一分钟(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 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; 
数据输出(drop=rc rd i keytime);
*将密钥表加载到内存中;
如果_n_=1,则执行;
声明散列pt(数据集:“键”,多数据:“是”,顺序:“是”);
宣布hiter iter(“pt”);
rc=零件定义(“id”);
rc=pt.defineData('keytime','no2','humidite','temperature');
rc=定义为一个参数();
结束;
*读取原始数据;
设置输入;
rc=pt.find();
*在需要时使用键表值进行更新;
如果rc=0,则执行;
rd=iter.first();
如果datetime gt keytime,则rd=iter.next();

如果rd=0和keytime-60,听起来好像有两个数据源。每分钟产生一次观察。另一个每秒生成一次观察。您希望将这两个数据集连接在一起,以便给定分钟内的所有频繁采样值获得与该分钟对应的相同偶尔采样值

假设NO2样本真的是每分钟一次,并且具有NO2_TD的时间日期值,并且GPS时间日期戳是“GPS_TD”[将变量命名为与函数、信息和格式相同通常是个坏主意]。连接表的最佳方法之一是通过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来忽略秒数。我们将datetime值移动到分钟边界(DTMINUTE),移动0分钟,直到分钟的开始,本质上是为了连接而截断秒数。INTNX通常用于获取月初、月末等信息。

如果您只需要将“时间排序”环境数据回填,而不考虑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)关联的最大日期时间值时,此代码模式将停止输出数据。听起来这对你的使用来说可能不是问题

请编辑您的问题并在底部以文本形式发布您的样本数据。您在尽职调查方面做了哪些工作,@etienne pelletier?