楼主: 040108020007
38346 9

一个关于sas日期时间读入格式的问题 [推广有奖]

  • 0关注
  • 0粉丝

已卖:1份资源

讲师

12%

还不是VIP/贵宾

-

威望
0
论坛币
3437 个
通用积分
2.2500
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
7488 点
帖子
210
精华
0
在线时间
603 小时
注册时间
2007-6-25
最后登录
2025-12-29

楼主
040108020007 发表于 2010-8-24 14:35:39 |AI写论文
50论坛币
在读入sas文件的时候,源文件格式为csv的,可以用Excel2007打开,但在读入sas的过程中出现了问题,下面的格式应该是用sas里的yyyymmdd:hh:mm:ss.s格式,但读入的时候是默认为字符串的。请问这个怎么处理?
2010/7/1 7:47:35
2010/11/1 17:47:35
2010/7/12 3:47:35

最佳答案

soporaeternus 查看完整内容

一个很傻的办法,利用时间中那个空格 年月日和时分秒分开导入,然后需要datetime型的话,计算生成下
关键词:excel2007 用excel EXCEL 怎么处理 sas的 时间 格式 SAS

本帖被以下文库推荐

沙发
soporaeternus 发表于 2010-8-24 14:35:40
  1. data a;
  2.         infile datalines dlm=', ';
  3.         input date:yymmdd10. time:time. x y;
  4.         datetime=date*86400+time;
  5.         format date yymmdd10. time time8. datetime datetime21.2;
  6.         datalines;
  7.         2010/7/1 7:47:35,1,3
  8. 2010/11/1 17:47:35,5,6
  9. 2010/7/12 3:47:35,7,8
  10. ;
  11. run;
复制代码
一个很傻的办法,利用时间中那个空格
年月日和时分秒分开导入,然后需要datetime型的话,计算生成下
已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
李会超 + 60 + 1 精彩帖子
lizhewenbei + 1 + 1 + 1 + 1 精彩帖子
040108020007 + 1 + 1 我很赞同

总评分: 经验 + 60  论坛币 + 1  学术水平 + 3  热心指数 + 2  信用等级 + 1   查看全部评分

Let them be hard, but never unjust

藤椅
roki 在职认证  发表于 2010-8-24 15:19:44
方法一:直接使用SAS的PROC IMPORT,可以直接识别DATETIME格式(SAS版本9.2)
PROC IMPORT OUT= WORK.T5
            DATAFILE= "C:\temp.csv"
            DBMS=CSV REPLACE;
     GETNAMES=NO;
     DATAROW=1;
RUN;

方法二:比较麻烦点
/*因为datetime的informat中的date部分只能是ddmmmyy或ddmmmyyyy的格式,如31jan2007,所以你提供的格式如使用datetime格式,系统无法识别,因此要手动去分别读取时间和日期再整合成一个变量*/
data temp;
input date yymmdd10. time time10.;
datetime=date*24*3600+time;
format datetime datetime20.;
cards;
2010/07/01 07:47:35
2010/11/01 17:47:35
2010/07/12 03:47:35
run;

补充说明:

1.SAS ENTERPRISE GUIDE 4.2中对数据导入提供了非常方便的操作界面。可以指定每一个变量的属性及格式。推荐使用

2. Datetime 对应的几种格式,供参考

30May2000:10:03:17.2    DATETIME20.
30May00 10:03:17.2        DATETIME18.
30May2000/10:03            DATETIME15.

3. 格式规范问题
很多日期数据不规范,如 2010/7/1 7:47:35
而真正规范的应该是,2010/07/01 07:47:35  
然而,往往正是这些不规范的数据导致了导入数据的出错。
已有 3 人评分经验 学术水平 热心指数 信用等级 收起 理由
灯小登 + 1 + 1 + 1 精彩帖子
李会超 + 60 精彩帖子
040108020007 + 1 + 1 我很赞同

总评分: 经验 + 60  学术水平 + 2  热心指数 + 2  信用等级 + 1   查看全部评分

板凳
dengyugg 发表于 2010-8-24 15:30:58
把这些格子选中没有出现惊叹号让"CONVERT TO NUMBER"吗?

报纸
040108020007 发表于 2010-8-24 16:12:23
有一点我搞不明白,1,3,5,6这些是用来干嘛的? 2# soporaeternus

地板
soporaeternus 发表于 2010-8-24 16:18:02
原文件是csv文件,可能会有其他变量,并且分隔符是“,”
测试下其他变量是否可以顺利导入......
Let them be hard, but never unjust

7
040108020007 发表于 2010-8-24 16:33:59
非常感谢,怪我没有说明白,我上面的日期和时间是同一条数据的2个部分,而且因为读入的时候不能作为时间读入,所以被读成了文本格式,这样的话像你说的先计算日期,转换为时间的方法就不可行了。希望能继续指点,谢谢! 3# roki

8
roki 在职认证  发表于 2010-8-24 18:07:19
7# 040108020007

如果自己写column input的方法(即我之前说的第2种方法),步骤比较麻烦,并且和你的数据质量有关系,如果你的字段的位置长度是固定的,也可以采用column格式导入数据方法。可惜你的数据长度又不是很一致,目前我能想到的是,先做一个导入取时间和日期,计算DATETIME变量;再做一个导入,导入剩下变量;最后做一个合并,合并两个数据集。因为使用DATA step导入数据时,好像不能同时使用间隔符方法(delimter)和column input方法。因此,不推荐该方法。

推荐一下两种方法:
1.如果你有安装EG(enterprise guide4.2)可以用导入数据向导,可以轻松解决这个问题。
2.你可以用PROC IMPORT 去导入你的CSV文件,我试过是可以的。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
040108020007 + 1 + 1 + 1 好的意见建议

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

9
逃亡周 发表于 2011-9-20 15:15:27
楼上说的那些都不对!其实,你直接读取,然后以datetime20.的格式显示,那么最后的日期就是我们想要的了。因为sas在读取我们的数据的时候,默认情况下,最小单位为日。后面的时间部分不足1天,自然没有显示出来。

10
逃亡周 发表于 2011-9-20 15:21:32
补充:在以datetime显示之前,需要讲date以天计算的数值改为以秒计算的数值。如下:
data tw_s;
        set myfile.tw_s;
        date=date*24*3600;
        format date datetime20.;
        drop a;
run;
已有 1 人评分经验 收起 理由
李会超 + 60 热心帮助其他会员

总评分: 经验 + 60   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 11:41