【问题标题】:Year to month date conversion年月日转换
【发布时间】:2017-04-10 01:12:50
【问题描述】:

我有一个宽格式数据集,其中包含从 Q1 1996Q4 2016 的事件的季度计数。

每个季度的变量名如下:

  • Q1 = yyyy0101_yyyy0401
  • Q2 = yyyy0401_yyyy0701
  • Q3 = yyyy0701_yyyy1001
  • Q4 = yyyy1001_yyyy0101

我有一个宏可以像这样转换它们:

local i = 1996

forvalues x = 1996/2016 { 
    local i = `i'+1
    gen count`x' = event_`x'0101_`x'0401 + event_`x'0401_`x'0701 + 
    event_`x'0701_`x'1001 + event_`x'1001_`i'0101
}

然后我按年份将我的数据以长格式折叠成单个变量count

reshape long count, i(xvars) j(year)

现在我想做同样的事情,但每季度一次。

执行完全相同的过程但按年逐季捕获计数总和的宏是什么?如果我想做半年呢?

【问题讨论】:

  • 我或多或少地保留了标题,但它与问题没有任何明显的关系。 (个人和我认为论坛的原则是仅针对语法,拼写,句法,样式和其他演示文稿错误和弱点编辑演示文稿,但保留发布的实质性错误和晦涩之处。)答案是非Stata宏观意义,这自然是附带的问题。

标签: datetime stata stata-macros


【解决方案1】:

在试图理解这一点时,我首先(迂腐或以其他方式)注意到您的代码不是 Stata 意义上的宏:SAS 用户???)其次(更具建设性)您的代码可以压缩为

forvalues x = 1996/2016 { 
    gen count`x' = event_`x'0101_`x'0401 + event_`x'0401_`x'0701 + event_`x'0701_`x'1001 + event_`x'1001_`x'0101
}

假设本地宏 ix 运行相同的值。 (这些是 Stata 意义上的宏。)但我不会从那里开始。

正如你所说,数据是宽格式的(我更喜欢术语布局,因为它不那么重载),所以主要的工作根本不是写循环,而是写到reshape 到 long。这个例子体现了一些猜测并展示了一些技巧。由于没有可使用的数据示例,我首先创建了一个沙箱:

clear 
set obs 21
local y = 1 
foreach v in yyyy0101_yyyy0401 yyyy0401_yyyy0701 yyyy0701_yyyy1001 yyyy1001_yyyy0101 { 
    gen `v' = `++y' 
}
gen year = 1995 + _n 

rename (yyyy*) (count#), addnumber 

reshape long count, i(year) j(quarter) 

gen qdate = yq(y, q) 

egen ycount = total(count), by(year) 
egen qcount = total(count), by(quarter) 
gen half = cond(inlist(quarter, 1, 2), 1, 2)
egen hcount = total(count), by(year half) 

list if year < 1998, sepby(year) 

     +------------------------------------------------------------------+
     | year   quarter   count   qdate   ycount   qcount   half   hcount |
     |------------------------------------------------------------------|
  1. | 1996         1       2     144       14       42      1        5 |
  2. | 1996         2       3     145       14       63      1        5 |
  3. | 1996         3       4     146       14       84      2        9 |
  4. | 1996         4       5     147       14      105      2        9 |
     |------------------------------------------------------------------|
  5. | 1997         1       2     148       14       42      1        5 |
  6. | 1997         2       3     149       14       63      1        5 |
  7. | 1997         3       4     150       14       84      2        9 |
  8. | 1997         4       5     151       14      105      2        9 |
     +------------------------------------------------------------------+

这与您所做的有何不同,因为您已经使用了reshape long?主要是强调可以在适当的位置生成您想要的不同时间尺度上的任何总计。您不需要重复的collapse 或同一数据集的不同版本。如何制表、列出或以其他方式处理重复将是不同的问题。

【讨论】:

  • 问题出在reshape long count, i(year) j(quarter)。通过编辑变量,我可以将日期转换为 1995-Q1 的 19950100 或 1995-Q2 的 19950400 等。我不知道你是如何从 reshape 到你正在显示的输出表的。当我这样做时,STATA 似乎不理解j(quarter)
  • 我的代码是独立且可重现的。您需要向我们展示您的代码,然后我们才能发表评论。 “似乎不明白”不是我可以诊断的错误。 stackoverflow.com/help/mcve
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
相关资源
最近更新 更多