使用重复创建日期序列

时间:2017-07-21 15:08:45

标签: sequence stata fill

我有一个天数列表(编号为195-720),每天都有多个观察结果。我最终想确定哪些日子是工作日,哪些是周末日。如果我可以在每个日期分配数字1-7,我就能做到这一点。目前,数据如下所示:

     Day    Household ID    Hour of Day
     195     1                  1
     195     1                  2
     195     1                  3
     195     1                  4
     196     1                  1
     196     1                  2
     196     1                  3
     197     1                  1
     197     1                  2

可能需要注意的是,每天的观察数量不一致(例如,第195天观察4次,第196天观察3次,第197天观察2次)。

我知道第195天是星期二,为了简单起见,我想编码等于“2”(星期三= 3,星期四= 4等)。

因此,我想得到以下输出:

     Day    Household ID    Hour of Day         DAY OF WEEK
     195     1                  1                  2 
     195     1                  2                  2
     195     1                  3                  2
     195     1                  4                  2
     196     1                  1                  3
     196     1                  2                  3
     196     1                  3                  3
     197     1                  1                  4
     197     1                  2                  4

在查看Stata文档后,我考虑使用DYM / DMY。但是,这不起作用,因为我没有原始的“日期”变量可供使用。相反,我只有一个数字“195”,对应于7月12日星期二。

我想使用类似的东西:

     bysort day: egen Hour_of_Day = seq(2, 3, 4, 5, 6, 7, 1)

然而,Stata告诉我这有语法错误。注意:我以“2”开头,因为我的第一天(195)是星期二。我还考虑了carryforwardmod(x,y)fill等命令。

有谁知道如何设置序列以填充每天的相同内容?如何修复此代码以实现所需的输出?

1 个答案:

答案 0 :(得分:0)

如果你知道195是星期二,那么逆向工程很简单。 193必须是周日和周六199。

让我们看看那个星期的沙箱,193到199.我们对我们自己的星期几功能的第一次猜测将使用mod()函数(一个命令)。 This paper对Stata中的应用程序进行了简短的试验。

. clear

. set obs 7
number of observations (_N) was 0, now 7

. gen day = 192 + _n

. gen dow = mod(day, 7)

. list, sep(0)

     +-----------+
     | day   dow |
     |-----------|
  1. | 193     4 |
  2. | 194     5 |
  3. | 195     6 |
  4. | 196     0 |
  5. | 197     1 |
  6. | 198     2 |
  7. | 199     3 |
     +-----------+

Stata的星期几会议是0表示星期日,6表示星期六。那只是一个轮换。

. gen DOW = mod(day + 3, 7)

. list, sep(0) 

     +-----------------+
     | day   dow   DOW |
     |-----------------|
  1. | 193     4     0 |
  2. | 194     5     1 |
  3. | 195     6     2 |
  4. | 196     0     3 |
  5. | 197     1     4 |
  6. | 198     2     5 |
  7. | 199     3     6 |
     +-----------------+

您可以查看Stata自己的dow()功能,以获取上述DOW的其他方式

gen StataDOW = dow(day - 2)

所以工作日的指标是(例如)

gen weekday = !inlist(DOW, 0, 6) 

gen weekday = inrange(DOW, 1, 5) 

gen weekday = !inlist(dow, 4, 3) 

使用创建的第一个变量。

碰巧,我最初写了egen, seq()。你的语法确实不合法,因为seq()是语法,但是括号内没有任何内容。我不会在这里使用egen,只是因为正确的答案基本上不可能出现多次(如你所有),如果你的数据有差距也不太可能。这里的推理是,或应该是重复和差距的强大。