首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将JSON日期导入SAS提供了不正确的$格式,其中期望日期时间数据

将JSON日期导入SAS提供了不正确的$格式,其中期望日期时间数据
EN

Stack Overflow用户
提问于 2017-08-23 11:32:46
回答 1查看 483关注 0票数 1

我试图将包含一些日期列/字段的数据导入到SAS中。数据采用JSON格式,因此需要在导入之前进行转换。这是我使用的SAS libname JSON。

但是,当我转换/导入数据时,SAS并不将日期解释为正确的日期,并且允许我使用日期约束等操作数据。相反,SAS以Format =$的形式导入日期。但是数据显示在导入的数据中。SAS没有错误地导入数据,但是数据中的“date_fi”以外的任何其他日期字段都没有正确地格式化为日期。

我正在使用以下脚本

文件名resp“C:\Temp\transakmenter-07.json”lrecl=1000000000;文件名jmap "C:\Temp\transaktioner.map";文件名头"c:\temp\header.txt"; 选项metaserver=“域”“metaport=8561 metarepository=”基础“metauser=”用户“元类=‘审查’; libname客户端sasiola tag=SOMETAG port=10011 host=“域名”signer="https://CENSORED"; HEADEROUT=head url=‘查看/按月查看?key=“2017-07” method= "GET“CT="application/ JSON”out=resp;libname space JSON fileref=resp map=jmap ;*automap=create; LIBNAME SASDATA碱基"D:\SASData";* outencoding='UTF-8'; 数据SASDATA.Transaktioner;设置space.Rows_value;运行; 数据null;如果存在(“Acubiz.EMS_TRANSAKTIONER”、“数据”),则rc=dosubl("proc;drop Acubiz.EMS_TRANSAKTIONER;quit;"); 数据Acubiz.EMS_TRANSAKTIONER;设置sasdata.transaktioner;运行; proc metalib;omr (library="/Shared Data/SAS Visual /Shared repname=“Foundation);folder="/Shared Data/SAS Visual Analytics/Autoload/AcubizEMSAutoload";选择("EMS_TRANSAKTIONER");运行;退出; 名称客户端清晰; 名称空间清晰;

对于这个转换,我使用以下名为'transaktioner.map‘的JSON map.file。

字段date_fi以正确的日期格式导入,我可以在中将其操作为日期格式,但confirmeddate_fi不导入。

这个文件中最重要的部分就在这里。

代码语言:javascript
运行
复制
{
  "NAME": "date_fi",
  "TYPE": "NUMERIC",
  "INFORMAT": [ "e8601dt19", 19, 0 ],
  "FORMAT": ["DATETIME", 20],
  "PATH": "/root/rows/value/date_fi",
  "CURRENT_LENGTH": 20
},


{
  "NAME": "confirmeddate_fi",
  "TYPE": "NUMERIC",
  "INFORMAT": [ "e8601dt19", 19, 0 ],
  "FORMAT": ["DATETIME", 20],
  "PATH": "/root/rows/value/confirmeddate_fi",
  "CURRENT_LENGTH": 20
},

你们知道我如何导入数据并解释日期字段吗?

我一直在处理JSON映射文件中的不同信息,以解决这个谜团,并设法在没有错误的情况下导入数据,但是SAS并不这样解释日期字段。

这里用一些示例(取自导入的数据)解释了实际字段:

代码语言:javascript
运行
复制
Reference that works
date_fi:                    "2017-07-14T00:00:00"  (Apparantly never timestamped but use T00:00:00 - checked 9 instances)

Should work
invoicedate_fi:             "2017-08-01T00:00:00"  (Apparantly never timestamped but use T00:00:00 - checked 9 instances)
invoicedate_fi:             "2017-07-19T00:00:00"
invoicedate_fi:             "2017-07-17T00:00:00"

arrivaldate_fi:             "2017-08-13T00:00:00"  (Apparantly never timestamped but use T00:00:00 - checked 9 instances)

departuredate_fi:           "2017-08-09T00:00:00"  (Apparantly never timestamped but use T00:00:00 - checked 9 instances)



Do not work as numeric - even though they are specified as dates in map-file (for use with SAS JSON Libname)
markedreadydate_fi:         "2017-08-02T11:41:56"   (This field is often but not always timestamped)
markedreadydate_fi:         "2017-07-31T15:08:03"
markedreadydate_fi:         "2017-07-19T00:00:00"

confirmeddate_fi:           "2017-07-21T00:00:00"   (This field is often but not always timestamped)
confirmeddate_fi:           "2017-08-06T20:11:26"
confirmeddate_fi:           "2017-07-14T18:38:41"

confirmeddatefinance_fi:    "2017-07-31T15:54:10"   (This field is often but not always timestamped)
confirmeddatefinance_fi:    "2017-08-17T10:33:32"
confirmeddatefinance_fi:    "2017-07-26T08:21:34"

markedreadydate_fi:         "2017-07-19T00:00:00"   (This field is often but not always timestamped)

有人在这个问题上有相关的信息吗,因为我的智慧已尽?在这个日期问题上已经用尽了SAS的技术支持。

PS:作为概念的证明,我们正在引进大约110.000行。而导入完成时没有任何错误。

这里可以找到一个很好的PDF来解释SAS中不同的ISO格式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-25 08:20:42

显然,解决方案是开始以字符而不是数字的形式导入日期列。因此,在SAS代码中将其转换为日期格式,如下所示:

代码语言:javascript
运行
复制
Data SASDATA.Transaktioner(drop=
arrivaldate_fi_temp
departuredate_fi_temp
confirmeddate_fi_temp
confirmeddatefinance_fi_temp
datetoshow_fi_temp 
date_fi_temp 
invoicedate_fi_temp 
markedreadydate_fi_temp
);
Set space.Rows_value(rename=(
confirmeddate_fi=confirmeddate_fi_temp 
datetoshow_fi=datetoshow_fi_temp 
date_fi=date_fi_temp 
invoicedate_fi=invoicedate_fi_temp 
markedreadydate_fi=markedreadydate_fi_temp 
arrivaldate_fi=arrivaldate_fi_temp 
departuredate_fi=departuredate_fi_temp 
confirmeddatefinance_fi=confirmeddatefinance_fi_temp
));
*length invoicedate_fi 8.;
format 
confirmeddate_fi 
datetoshow_fi 
date_fi 
invoicedate_fi 
markedreadydate_fi
arrivaldate_fi
departuredate_fi
confirmeddatefinance_fi
datetime20.;
if confirmeddate_fi_temp ne '' then confirmeddate_fi=input(confirmeddate_fi_temp,E8601DT19.); else confirmeddate_fi=.;
if datetoshow_fi_temp ne '' then datetoshow_fi=input(datetoshow_fi_temp,E8601DT19.); else datetoshow_fi=.;
if date_fi_temp ne '' then date_fi=input(date_fi_temp,E8601DT19.); else date_fi=.;
if invoicedate_fi_temp ne '' then invoicedate_fi=input(invoicedate_fi_temp,E8601DT19.); else invoicedate_fi=.;
if markedreadydate_fi_temp ne '' then markedreadydate_fi=input(markedreadydate_fi_temp,E8601DT19.); else markedreadydate_fi=.;
if arrivaldate_fi_temp ne '' then arrivaldate_fi=input(arrivaldate_fi_temp,E8601DT19.); else arrivaldate_fi=.;
if departuredate_fi_temp ne '' then departuredate_fi=input(departuredate_fi_temp,E8601DT19.); else departuredate_fi=.;
if confirmeddatefinance_fi_temp ne '' then confirmeddatefinance_fi=input(confirmeddatefinance_fi_temp,E8601DT19.); else confirmeddatefinance_fi=.;
run;

然后,我将删除用于导入地图文件中日期字段的数字类型的所有细节。这样,JSON libname就不负责解释日期格式了。SAS有。

即。对于alle日期字段,必须将映射文件规范更改为类似于此的内容。

代码语言:javascript
运行
复制
{
  "NAME": "date_fi",
  "TYPE": "CHARACTER",
  "PATH": "/root/rows/value/date_fi",
  "CURRENT_LENGTH": 19
},
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45838559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档