Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 为特定日历日创建虚拟变量_Date_Stata - Fatal编程技术网

Date 为特定日历日创建虚拟变量

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

在Stata中,我想为一个月的第25个日历日生成一个指标,如果该日历日是周末或假日,则为上一个工作日生成指标。我在Stata中使用一个业务日历,该日历为非工作日生成一个缺少的值

对于这一点,最有效的脚本是什么,而不是迭代地执行以下操作:

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)

如果该系列的最后一个日期与被标记的日期重合,则会出现一个小故障。我在回答中多加了一点评论。如果该系列的最后一个日期与被标记的日期一致,则会出现一个小问题。我在回答中多加了一点评论。我改变了看似非法的语法。如果这不是你的意思,请还原并修复。我已经更改了看似非法的语法。如果这不是你的意思,请回复并修复。