【问题标题】:SAS daylight savings time conversion SASSAS 夏令时转换 SAS
【发布时间】:2021-09-10 20:15:13
【问题描述】:

我正在尝试在我的程序中进行时区转换,但遇到了一些困难。下面我有

data GMT_conv;
    set table;
    if city in ('Atlanta', 'Baltimore' , 'New York') then conv = -5;
    if city in ('Minneapolis') then conv = -6;
    if city in ('Salt Lake City') then conv = -7;
    if city in ('San Francisco') then conv = -8;
run;

但是,这仅适用于非夏季月份。夏令时更改了 3 月的第二个星期日和 Novmember 的第一个星期日。我想不出一种方法来执行此 if 语句(在 SAS 或 proc sql 中)

我想要什么:

if (between 2nd sunday in march and 1 sunday of november) 
       then conv +1;

有什么建议吗?

【问题讨论】:

    标签: sql sas dst


    【解决方案1】:

    我的建议是使用 SAS 的内置时区函数和格式/信息,而不是自己滚动。

    首先,SAS's help page on time zones 展示了如何使用时区指定时间。然后,您可以看到如何使用TZONES2U 函数将 SAS 日期时间转换为 UTC,或使用TZONEU2S 转换回来。这将自动处理夏令时!

    例如:

    data time_data;
    format dtval datetime17.;
    input city $ dtval :datetime17.;
    datalines;
    Atlanta 08JUN2021:11:00:00
    Baltimore 08JAN2021:11:00:00
    Chicago 08JUN2021:11:00:00
    Dallas 08JAN2021:11:00:00
    ;;;;
    run;
    
    data want;
      set time_data;
      length tz $32;
      if city in ('Atlanta','Baltimore') then tz='America/New_York';
      if city in ('Chicago','Dallas') then tz='America/Chicago';
      
      format dtval_utc datetime17.;
      dtval_utc = tzones2u(dtval,tz);
      time_diff = dtval-dtval_utc;
      
      format time_diff time8.;
    run;
    

    这显示了 DST 的差异(请注意亚特兰大在夏天是 4 小时,而巴尔的摩在冬天是 5 小时。)

    当然,您仍然需要知道正确的时区是什么;您可以手动执行此操作,就像您最初所做的以及我在示例中所做的那样,或者您可以在某种程度上进行查找(可能使用邮政编码和 SASHELP.ZIPCODE)。

    【讨论】:

    • 因此,我之所以尝试将其布局,是因为我的数据是如何呈现的。首先,我只对这里的时间感兴趣,而不是日期。我的数据是一列是 GMT 日期,另一列是 GMT 分钟时间(格林威治标准时间午夜过后的分钟数)。我可以使用这种方法,但我不确定如何将分钟时间加入日期并使其成为 SAS dateTime,然后无论如何我都必须在最后截断时间。可行但可能更困难,因为我只与大约 8 个城市合作。
    • 时间与日期时间在这里无关紧要 - 当然是夏令时部分!如果一切都是 UTC(如果您指的是无时区日期/时间,则应该使用该术语),然后将其放入一个字段中,使用 TZONEU2S,然后以您想要的方式将其拆分回来。使用dhms() 组合它们(dt = dhms(date,0,0,time);)。不要手动编写代码,相信我——尤其是在 5 或 10 年后 DST 规则发生变化,您不记得您编写了此代码! SAS 会修复它们的功能,你不会记得的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2015-07-02
    相关资源
    最近更新 更多