You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:11:42