Определить формат даты на основе заданной даты в текстовом файле - PullRequest
0 голосов
/ 01 мая 2018

Мне были предоставлены даты / даты в .txt файле

Например:

20180422
02122018
2018/04/22
22/04/2018
04-02-2018
2018-04-20 13:05:56

Теперь, сначала я импортирую выше .txt файл, поэтому он будет в числовом формате в наборе данных sas. Для каждой даты мне нужно автоматически определить date_format.

Примеры форматов:

yyyymmdd
mmddyyyy
yyyy/mm/dd
dd/mm/yyyy
dd-mm-yyyy
yyyy-mm-dd hh:mm:ss

Как определить формат на основе указанной даты?

1 Ответ

0 голосов
/ 01 мая 2018

На первом шаге я сохранил даты как String, затем использовал input(a,anydtdte20.) на следующем шаге, чтобы преобразовать их в даты SAS и input(a,ymddttm24.) для datetime; таким образом, все даты с '/' и'- 'будут читаться как даты SAS.

Обратите внимание, что я использую локаль для DMY, а в случае даты и времени я извлекаю только часть даты.

options DATESTYLE=DMY;
data have;
length a $ 23 ;
input a $;
datalines;
20180422
12022018
2018/04/22
22/04/2018
04-02-2018
2018-04-20T13:05:56
;
run;

data want;
set have;
format date_a date9.;
date_a=input(a,anydtdte20.);
Year_a=year(date_a);
month_a=month(date_a);
day_a=day(date_a);
run;

Выход (Требуется набор данных):

a=20180422 date_a=22APR2018 Year_a=2018 month_a=4 day_a=22
a=12022018 date_a=12FEB2018 Year_a=2018 month_a=2 day_a=12
a=2018/04/22 date_a=22APR2018 Year_a=2018 month_a=4 day_a=22
a=22/04/2018 date_a=22APR2018 Year_a=2018 month_a=4 day_a=22
a=04-02-2018 date_a=04FEB2018 Year_a=2018 month_a=2 day_a=4
a=2018-04-20T13:05:56 date_a=20APR2018 Year_a=2018 month_a=4 day_a=20

В этой SAS Post .

вы можете найти более динамическую информацию о дате и дате и времени.

Чтобы продвинуться еще на один шаг, вы можете создать дополнительные столбцы / переменные для каждого необходимого формата, здесь добавлена ​​обработка даты и времени:

proc sql;
create table dates as 
select
a as Date_String ,
date_a as SAS_Date9 format=date9. ,
date_a as SAS_YYMMDDN8 format=YYMMDDN8. ,
date_a as SAS_DDMMYYN8 format=DDMMYYN8. ,
date_a as SAS_YYMMDDS10 format=YYMMDDS10. ,
date_a as SAS_DDMMYYS10 format=DDMMYYS10. ,
case when LENGTH(a) > 10 then input(a,ymddttm24.) else . end as SAS_Datetime21 format=datetime21. ,
case when LENGTH(a) > 10 then timepart(input(a,ymddttm24.)) else . end as SAS_Time format=time8. 
from work.want;
quit;

Выход:

SAS_Date9=22APR2018 SAS_YYMMDDN8=20180422 SAS_DDMMYYN8=22042018 SAS_YYMMDDS10=2018/04/22
SAS_DDMMYYS10=22/04/2018 SAS_Datetime21=. SAS_Time=.
SAS_Date9=12FEB2018 SAS_YYMMDDN8=20180212 SAS_DDMMYYN8=12022018 SAS_YYMMDDS10=2018/02/12
SAS_DDMMYYS10=12/02/2018 SAS_Datetime21=. SAS_Time=.
SAS_Date9=22APR2018 SAS_YYMMDDN8=20180422 SAS_DDMMYYN8=22042018 SAS_YYMMDDS10=2018/04/22
SAS_DDMMYYS10=22/04/2018 SAS_Datetime21=. SAS_Time=.
SAS_Date9=22APR2018 SAS_YYMMDDN8=20180422 SAS_DDMMYYN8=22042018 SAS_YYMMDDS10=2018/04/22
SAS_DDMMYYS10=22/04/2018 SAS_Datetime21=. SAS_Time=.
SAS_Date9=04FEB2018 SAS_YYMMDDN8=20180204 SAS_DDMMYYN8=04022018 SAS_YYMMDDS10=2018/02/04
SAS_DDMMYYS10=04/02/2018 SAS_Datetime21=. SAS_Time=.
SAS_Date9=20APR2018 SAS_YYMMDDN8=20180420 SAS_DDMMYYN8=20042018 SAS_YYMMDDS10=2018/04/20
SAS_DDMMYYS10=20/04/2018 SAS_Datetime21=20APR2018:13:05:56 SAS_Time=13:05:56

Dates

...