SAS 夏令时转换 SAS
SAS daylight savings time conversion SAS
我正在尝试在我的程序中进行时区转换,但 运行 遇到了一些困难。下面我有
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;
然而,这仅在非夏季月份才正确。夏令时更改为三月的第二个星期日和十一月的第一个星期日。我想不出一种方法来执行此 if 语句(在 SAS 或 proc sql)
我想要的:
if (between 2nd sunday in march and 1 sunday of november)
then conv +1;
有什么建议吗?
我的建议是使用 SAS 的内置时区函数和 formats/informats,而不是自己动手。
首先,SAS's help page on time zones shows how to specify times with a time zone. Then, you can see how to use the TZONES2U function to convert SAS datetimes to UTC, or 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 ;
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;
这显示了夏令时的差异(请注意亚特兰大在夏季有 4 小时的假期,而巴尔的摩在冬季有 5 小时的假期。)
当然,您仍然需要能够知道正确的时区是什么;您可以手动执行此操作,就像您最初所做的以及我在示例中所做的那样,或者您可以在某种程度上进行查找(可能使用邮政编码和 SASHELP.ZIPCODE)。
我正在尝试在我的程序中进行时区转换,但 运行 遇到了一些困难。下面我有
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;
然而,这仅在非夏季月份才正确。夏令时更改为三月的第二个星期日和十一月的第一个星期日。我想不出一种方法来执行此 if 语句(在 SAS 或 proc sql)
我想要的:
if (between 2nd sunday in march and 1 sunday of november)
then conv +1;
有什么建议吗?
我的建议是使用 SAS 的内置时区函数和 formats/informats,而不是自己动手。
首先,SAS's help page on time zones shows how to specify times with a time zone. Then, you can see how to use the TZONES2U function to convert SAS datetimes to UTC, or 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 ;
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;
这显示了夏令时的差异(请注意亚特兰大在夏季有 4 小时的假期,而巴尔的摩在冬季有 5 小时的假期。)
当然,您仍然需要能够知道正确的时区是什么;您可以手动执行此操作,就像您最初所做的以及我在示例中所做的那样,或者您可以在某种程度上进行查找(可能使用邮政编码和 SASHELP.ZIPCODE)。