Date 为特定日历日创建虚拟变量
在Stata中,我想为一个月的第25个日历日生成一个指标,如果该日历日是周末或假日,则为上一个工作日生成指标。我在Stata中使用一个业务日历,该日历为非工作日生成一个缺少的值 对于这一点,最有效的脚本是什么,而不是迭代地执行以下操作:Date 为特定日历日创建虚拟变量,date,stata,Date,Stata,在Stata中,我想为一个月的第25个日历日生成一个指标,如果该日历日是周末或假日,则为上一个工作日生成指标。我在Stata中使用一个业务日历,该日历为非工作日生成一个缺少的值 对于这一点,最有效的脚本是什么,而不是迭代地执行以下操作: gen d25 = d == 25 replace d25 = cond(d[_n+1]==25 & date[_n+1]==.,1,d25) Etc... 下面是一个如何做到这一点的示例: sysuse sp500, clear keep dat
gen d25 = d == 25
replace d25 = cond(d[_n+1]==25 & date[_n+1]==.,1,d25)
Etc...
下面是一个如何做到这一点的示例:
sysuse sp500, clear
keep date
gen in_bcal=1
tsset date
tsfill
gen day25=cond(day(date)==25,1,0)
drop if missing(in_bcal) & day25==0
sort date
replace day25=day25[_n+1] if missing(in_bcal[_n+1])
drop if missing(in_bcal)
drop in_bcal
这可能可以用一种更聪明的方法来实现。下面是一个如何实现的示例:
sysuse sp500, clear
keep date
gen in_bcal=1
tsset date
tsfill
gen day25=cond(day(date)==25,1,0)
drop if missing(in_bcal) & day25==0
sort date
replace day25=day25[_n+1] if missing(in_bcal[_n+1])
drop if missing(in_bcal)
drop in_bcal
这可能可以用一种更聪明的方式来实现。作为@Dimitry答案的补充,我想解决两个问题: 1.我对原始海报问题的解释是,他一开始就制定了一份商业日历。因此,问题在于标记一个月中的任意一天(数字),它可以或不能出现在业务日历中。如果不存在,则我们标记上一个工作日 如果是这种情况,那么我们需要对原始代码进行少量添加,因为如果涉及业务日历,
tsfill
将无法按预期工作。(sp500
数据库date
变量不是description
将显示的业务日历。)示例如下:
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
继续使用类似Dimitry的代码
2.第二个问题是,如果系列的最后一次观察正好是我们想要标记的日期,那么Dimitry的代码将导致丢失。这可以通过查找第31天而不是第25天来检查。2001年12月第31天将有一个失踪
下面是解决这两个问题的完整示例,希望不会添加任何错误。迪米特里,当然,认为一般(正确)的想法是正确的,任何错误都是我自己的
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)
作为对@Dimitry答案的补充,我想解决两个问题: 1.我对原始海报问题的解释是,他一开始就制定了一份商业日历。因此,问题在于标记一个月中的任意一天(数字),它可以或不能出现在业务日历中。如果不存在,则我们标记上一个工作日 如果是这种情况,那么我们需要对原始代码进行少量添加,因为如果涉及业务日历,
tsfill
将无法按预期工作。(sp500
数据库date
变量不是description
将显示的业务日历。)示例如下:
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
继续使用类似Dimitry的代码
2.第二个问题是,如果系列的最后一次观察正好是我们想要标记的日期,那么Dimitry的代码将导致丢失。这可以通过查找第31天而不是第25天来检查。2001年12月第31天将有一个失踪
下面是解决这两个问题的完整示例,希望不会添加任何错误。迪米特里,当然,认为一般(正确)的想法是正确的,任何错误都是我自己的
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)
如果该系列的最后一个日期与被标记的日期重合,则会出现一个小故障。我在回答中多加了一点评论。如果该系列的最后一个日期与被标记的日期一致,则会出现一个小问题。我在回答中多加了一点评论。我改变了看似非法的语法。如果这不是你的意思,请还原并修复。我已经更改了看似非法的语法。如果这不是你的意思,请回复并修复。