【问题标题】:How to Define date format from a given date如何从给定日期定义日期格式
【发布时间】:2018-04-27 05:19:07
【问题描述】:

我想知道,我们如何根据给定日期定义日期格式

例如,我的日期为 20180423,然后在 sas 中我想将格式定义为 'yyyymmdd'

同样,我在数据中给出的日期为 12022018,然后我想定义为“ddmmyyyy”

请注意,日期是在适当的日期提供给我的,但我现在想定义格式。 将来给出的日期可能会有所不同 所以我需要通过 SAS 处理所有日期格式

我认为的日期是 20180422 使用 substr 函数

data test;
a=20180422;
a=substr(a,1,4);
b=substr(a,5,1);
c=substr(a,7,1);
run;

但不确定。

如果有人能提供解决方案,那真的对我的项目工作有帮助。

在此先感谢您的帮助。

【问题讨论】:

  • anydtdte 信息将尝试将许多不同类型的字符串转换为日期值。请注意它是否默认为 M-D-Y 或 D-M-Y 模糊字符串的顺序取决于语言环境设置。
  • 如果您的约会日期类似于20180404,会发生什么?如何判断哪个是月哪个是日期?

标签: date datetime sas formatting


【解决方案1】:

听起来您想将各种值转换为日期。 SAS 将日期存储为数字,即自 1960 年 1 月 1 日以来的天数。通常将此数字格式化为日期,以首选格式显示。

当导入已经采用某种格式的日期时,必须使用input 函数和一个信息,将格式化的值转换为 SAS 日期。如果读入的日期值都是相同的格式,则可以使用特定的信息。在您使用不同格式的情况下,您可以使用 anydtdte. 信息,它将大多数标准日期格式转换为 SAS 日期。

下面的示例将 3 种不同的日期格式转换为 SAS 日期,然后以 date9. 格式显示 SAS 日期。我已将未格式化和格式化的新值都打印到日志中,以便您可以看到它们以数字形式存储。

data _null_;
input date_in $20.;
date_out = input(date_in, anydtdte20.);
put date_in date_out date_out :date9.;
datalines;
20180422
12022018
27apr2018
;
run;

【讨论】:

  • 感谢回复,我认为它会将所有日期格式化为 date9。具体格式,所以表示 20180422 自动转换为 yyyymmdd。 , 12022018 自动转换为 ddmmyyyy。最后日期 27apr2018 转换为 date9。简而言之,从给定日期(我从 .txt 文件导入日期)例如 20180424 列名 DT 存在于 .txt 文件中,那么现在我需要检查前 4 位数字仅是年份,如果 .txt 文件中存在不同的日期,例如 20122018,这里的前 2 位数字是 'dd' 、 'mm' 和 'yyyy' 所以从给定的日期开始我需要定义格式。所以这里的格式完全改变了
  • 我仍然不确定我是否理解你。上面的代码会将您声明的两个数字都转换为有效的 SAS 日期。导入时无需事先知道它们的格式
【解决方案2】:

使用input(a,anydtdte20.);这会将任何日期转换为 SAS 日期,然后使用函数Year()Month()Day() 提取所需的数据。 您会发现这个 SAS Post 对于日期和语言环境非常有用。

解决方案:

我创建了一个有两行的表;每行都有不同的日期格式 YYYYMMDD 和 DDMMYYYY,向您展示代码将如何处理不同的日期格式,将它们保存为 SAS 日期并将它们分解为年、月和日:

options DATESTYLE=DMY;
data have;
input a;
datalines;
20180422
12022018
;
run;

data test;
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

【讨论】:

  • 将尝试使用它,感谢您的帮助。在第二个日期 12022018' 将是 ddmmyyyy 正确但这里月份显示 12 ,实际上 date_a 应该显示 12 对吗?
  • 如果您的日期区域设置为美国,它将被读取为 MMDDYY,如果区域设置为欧洲,它将被读取为 DDMMYY。我将在我的代码中添加一个选项语句以使用 DMY 语言环境。
  • 感谢你们的帮助,假设我也有带有 / 和 -(连字符)的日期格式。我在想的是将 date_format 保存在文件 ddmmyyy、mmddyyyy、yyyymmdd、dd/mm/yyyy、yyyy/mm/dd、mm/dd/yyy 中,并且 1 日期格式的时间戳为 yyyy-mm-dd hh:mm: ss 将在 hh:mm:ss 中有冒号,我现在已经将 date_formats 和它们的长度一起存储在 1 个表中,在 .txt 文件中我已经给出了 ex 2018-06-23 的日期,然后它应该自动获取 yyyy-mm- dd 从表中,如果 20180406 则 yyyymmdd。你能帮我解决这个问题吗
  • 请在新问题中提出。
【解决方案3】:

您可以在数据步骤中使用 if 条件。使用 If 条件,检查条件是否为真(检查日期值是否满足所需条件),然后使用 put 函数格式化日期。Put 函数可以将源作为第一个参数,将格式作为第二个参数,并返回格式化后的值.同一列的不同值,可以通过这种方式指定不同的格式。

类似的,

  if a = 'date1CheckCondtion' then newA = put(a , dateformat1.);
  if a = 'date2' then newA = put(a , dateformat2.);

然后您可以选择以这样的通用格式获取所有值:

  dateA=input(newA,mmddyy6.);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多