如何用SAS正确读取CSV中以515形式表示5:15的航班时间数据?
处理CSV中紧凑数字时间的SAS简便读取方法
嘿,这个问题我之前帮不少同行解决过——你说的这种不带冒号的紧凑时间(比如515对应5:15),确实用默认的time.格式读会出问题,不过SAS里有个超简便的直接读取方案,不用写那些繁琐的拆分转换代码!
核心思路
CSV里的时间其实是HHMM格式的紧凑写法,只是上午的小时数可能省略了前导0(比如5:15写成515而不是0515)。SAS的HHMM.格式本身能识别HHMM格式的字符串,但要求是4位,所以我们只需要给不足4位的时间补上前导0,再用HHMM.转换就行。
具体实现(分两种情况)
情况1:CSV中的时间是字符型变量
假设你的CSV里时间列叫raw_time,读取时可以这样处理:
data flight_data; infile 'your_flight_file.csv' dlm=',' dsd firstobs=2; /* firstobs=2跳过表头 */ length raw_time $4; input raw_time $ flight_num $ dest ...; /* 读取其他变量 */ /* 补前导0+转成SAS时间值 */ actual_time = input(put(raw_time, Z4.), HHMM.); /* 用time5.格式显示成hh:mm样式 */ format actual_time time5.; run;
情况2:CSV中的时间是数字型变量
如果raw_time是数字(比如单元格里存的是515而不是"515"),只需要调整一下补0的步骤:
data flight_data; infile 'your_flight_file.csv' dlm=',' dsd firstobs=2; input raw_time flight_num $ dest ...; /* 先把数字转成4位带前导0的字符串,再转时间 */ actual_time = input(put(raw_time, Z4.), HHMM.); format actual_time time5.; run;
额外技巧:处理无效值
如果数据里有脏数据(比如非时间格式的字符/数字),可以加??修饰符避免程序报错,同时把无效值设为缺失:
actual_time = input(put(raw_time, Z4.), ?? HHMM.);
为什么这是更简便的方法?
比起手动拆分小时(比如取前1-2位)、分钟(取后2位)再计算秒数的代码,这种方式完全利用SAS自带的格式和输入函数,代码更简洁易读,维护起来也方便——不用考虑各种边界情况(比如10分钟写成10还是010),Z4.和HHMM.会帮你搞定。
内容的提问来源于stack exchange,提问作者user3831696
相关产品推荐
相关产品推荐

