【问题标题】:Define date format on the basis of given date in a txt file根据 txt 文件中的给定日期定义日期格式
【发布时间】:2018-05-01 06:29:00
【问题描述】:

我已在 .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 月 1 日呢?程序如何知道是日还是月?
  • .txt 文件有多少列/字段?
  • 请在问题中添加您的 .txt 文件/导入数据和输出的示例?我会给出一个初步答案,看看这是否能回答你的问题。
  • 请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。
  • 问题是如何将值转换为日期值?还是如何识别用于每个不同观察的格式(模式)?

标签: date datetime sas format informat


【解决方案1】:

在我的第一步中,我将日期保存为字符串,然后在接下来的步骤中使用 input(a,anydtdte20.) 将它们转换为 SAS 日期,并将 input(a,ymddttm24.) 用于日期时间;这样,所有带有“/”和“-”的日期都将被读取为 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

【讨论】:

  • 非常感谢,好的,现在我可以正确转置变量了,实际上在 .txt 文件中我有日期,例如 20180420 和最终输出我需要 yyyymmdd
  • .txt 文件中有大约 100 列,但我只需要您的帮助来根据给定日期定义日期格式。说在 100 列中有 5-6 列带有日期字段,所以每列我都需要定义日期格式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多