合并变量名相同但观测数不同的SAS时间序列数据集
批量合并SAS时间序列文件为BID/ASK/Mid表的解决方案
嘿,作为SAS新手碰到这种批量处理的需求完全不用慌,我来给你一套清晰的实操方案,帮你把分散的小文件合并成三个大表~
整体思路
你的每个sas7bdat文件变量结构一致,我们可以先把文件夹里所有符合格式的文件找出来,然后逐个读取,把BID、ASK、Mid相关的变量分别提取出来,追加到对应的目标大表中。
具体步骤&代码
1. 指定数据文件夹并获取文件列表
首先得告诉SAS你的数据存在哪个文件夹,然后把所有cq_ts_*.sas7bdat格式的文件列出来,方便后续循环处理:
/* 替换成你实际的文件夹路径,Windows用双反斜杠或正斜杠,Linux用正斜杠 */ filename rawdata "C:\Your\Actual\Data\Folder"; /* 生成包含所有目标文件的数据集 */ data file_list; length filename $256 symbol $10; /* 读取目录下所有cq_ts开头的sas7bdat文件 */ infile rawdata("cq_ts_*.sas7bdat") filename=filename lrecl=256; input; /* 从文件名里提取SYMBOL(比如AAA、BBB),方便后续标记数据来源(可选) */ symbol = scan(scan(filename, 1, '.'), 3, '_'); run;
2. 用宏循环批量合并拆分
接下来我们写一个宏来自动处理每个文件,把对应的变量拆分到三个大表中。这里用proc append会比循环set更高效,尤其是文件数量多的时候:
/* 定义宏来处理批量合并 */ %macro merge_ts_tables; /* 先初始化三个空表,用第一个文件的变量结构来保证类型匹配 */ data bid ask mid; set file_list(obs=1); /* 读取第一个文件,只取变量结构(stop语句只读一行) */ set "&rawdata.\&filename."(keep=date time symbol bid_:); /* 注意:这里的bid_:是指所有以bid开头的变量,你要根据实际变量名调整! 如果你的BID变量是bid_price、bid_volume,这样写没问题;如果是其他名字,比如bp、bq,就直接列出来:keep=date time symbol bp bq */ stop; run; /* 获取文件总数,用于循环计数 */ proc sql noprint; select count(*) into :total_files from file_list; quit; /* 循环处理每个文件 */ %do i = 1 %to &total_files.; /* 把当前文件名和SYMBOL存入宏变量 */ data _null_; set file_list(firstobs=&i. obs=&i.); call symputx('curr_file', filename); call symputx('curr_symbol', symbol); run; /* 追加BID相关变量到BID表 */ proc append base=bid data=rawdata.&curr_file.(keep=date time symbol bid_:); run; /* 追加ASK相关变量到ASK表 */ proc append base=ask data=rawdata.&curr_file.(keep=date time symbol ask_:); run; /* 追加Mid相关变量到Mid表 */ proc append base=mid data=rawdata.&curr_file.(keep=date time symbol mid_:); run; %end; %mend; /* 执行宏,开始合并 */ %merge_ts_tables;
关键注意事项
- 变量名匹配:一定要根据你实际的变量名修改
keep=后面的内容!比如如果Mid表的变量是mid_price,那mid_:就没问题;如果是mprice,就直接写mprice。 - 变量类型一致性:确保所有原始文件中同名字段的类型一致(比如
date都是SAS日期型,time都是时间型),不然proc append会报错。如果有不一致的情况,需要先在读取时转换类型。 - 路径正确性:文件夹路径一定要写对,Windows系统注意用双反斜杠
\\或者正斜杠/,避免转义问题。
这样处理完之后,你就得到三个包含所有文件对应数据的大表:bid、ask和mid啦~
内容的提问来源于stack exchange,提问作者eternity1
相关产品推荐
相关产品推荐

