作为@Dimitriy 回答的补充,我想解决两个问题:
1.我对原始发帖人问题的解释是,他开始时有一个商业日历。因此,问题在于标记一个月中的任意一天(数字),该日期可以或不可以出现在业务日历中。如果不存在,则我们标记前一个工作日。
如果是这种情况,那么我们需要对原始代码进行少量添加,因为如果涉及业务日历,tsfill 将无法按预期工作。 (sp500 数据库 date 变量不是 describe 将显示的业务日历。)例如:
clear all
set more off
*----- example data -----
set obs 19
gen bdate = _n
format bdate %tbsimple // format as "simple" business calendar
*----- tsfill -----
tsset bdate
tsfill
list
tsfill 在这种情况下不会填写任何内容;它不会填写非工作日。这些日子已经从日历上划掉了,所以没有什么可填写的。我们需要:
gen rdate = dofb(bdate, "simple")
format rdate %td
将商务日历日期转换为常规日期。然后我们可以使用常规日期变量rdate 继续处理 Dimitriy 的代码。
2. 第二个问题是,如果系列的最后一次观察恰好是我们想要标记的那一天,那么 Dimitriy 的代码将导致缺失。这可以通过查找第 31 天而不是 25 天来检查。2001 年 12 月将缺少第 31 天。
下面是一个完整的示例,它解决了这两个问题,并且希望不会增加任何错误。当然,Dimitriy 将一般(正确)的想法归功于自己,任何错误都是我自己的。
clear all
set more off
*----- example data -----
set obs 19
gen bdate = _n
format bdate %tbsimple // format as "simple" business calendar
list, sep(0)
*----- what you want -----
gen rdate = dofb(bdate, "simple") // from business to regular
format rdate %td
tsset rdate
tsfill
gen day6 = (day(rdate) == 6)
drop if missing(bdate) & !day6
replace day6 = 1 if missing(bdate[_n+1]) & day6[_n+1] == 1
drop if missing(bdate)
list, sep(0)