如何在Stata中按秒聚合生成Price2变量并赋值至同时间组最后一行?
我明白你的需求啦——要生成一个Price2变量,它是同一秒内所有price值的总和,并且只把这个总和放到对应时间组的最后一行,其他行留空(缺失值)对吧?而且你的Day和Time都是字符串类型,那咱们一步步来实现:
第一步:合并日期时间字符串,生成唯一的秒级分组标识
因为Day和Time是分开的字符串,首先得把它们合并成一个完整的日期时间字符串,这样才能准确按“每秒”分组。假设你的Day格式是YYYY-MM-DD、Time格式是HH:MM:SS,用concat命令合并:gen datetime_str = concat(Day, " ", Time)如果你的日期时间格式有差异,只需要调整合并时的分隔符即可,核心是让合并后的字符串能唯一标识每一秒。
第二步:按秒分组计算price的总和
用bysort命令按合并后的datetime_str分组,先计算组内累计和,再提取每组最后一行的累计值(也就是该秒的总price):bysort datetime_str: gen total_price = sum(price) bysort datetime_str: replace total_price = total_price[_N]这一步会让同一秒内的所有行都带上该秒的price总和,方便后续筛选最后一行。
第三步:仅保留每组最后一行的总和作为Price2
现在只需要把每组最后一行的总和赋值给Price2,其他行设为缺失值:bysort datetime_str: gen Price2 = total_price if _n == _N这样
Price2就只会在每个时间组的最后一行显示该秒的price总和,完美匹配你的预期结果。(可选)清理临时变量
如果不需要中间生成的datetime_str和total_price,可以用以下命令删除:drop datetime_str total_price
示例效果
假设你的原始数据是这样的:
Day Time price
2024-05-20 10:00:01 5
2024-05-20 10:00:01 3
2024-05-20 10:00:02 2
运行完上述命令后,结果会变成:
Day Time price Price2
2024-05-20 10:00:01 5 .
2024-05-20 10:00:01 3 8
2024-05-20 10:00:02 2 2
内容的提问来源于stack exchange,提问作者Amin Karimi

