【问题标题】:How to convert SIF dates into HRF and save them in a macro in Stata?如何将 SIF 日期转换为 HRF 并将它们保存在 Stata 的宏中?
【发布时间】:2016-05-18 12:54:38
【问题描述】:

Stata 有一些简单的函数可以将人类可读格式 (HRF) 的日期转换为 Stata 内部格式 (SIF)。但是,我想将 SIF 日期转换为 HRF 日期。使用display %td 和相关命令,我可以打印正确的日期。但我想将转换后的日期保存到宏中。 不幸的是,下面的代码 sn -p 不起作用:

di %tw 2080
local week %tw 2080
di "`week'"

更新:我现在使用以下循环来重新标记变量的最初目的。

foreach i of varlist week_* {
   local weekcount = substr("`i'", 6, 9)
   local tmp_year = 1960 + int(`weekcount'/52)
   local tmp_week = 1 + `weekcount' - int(`weekcount'/52)*52
   lab var `i' "`tmp_year'w`tmp_week'"
}

【问题讨论】:

    标签: date stata


    【解决方案1】:

    这个答案分为两个不同的部分。

    首先,我非常怀疑您的日期是否与 Stata 每周日期相对应。这些每周日期的定义是

    1. 任何一年的第 1 周都从 1 月 1 日开始,无论那是一周中的哪一天。

    2. 第 2 周等以 7 天后的倍数开始。

    3. 第 52 周始终包括 8 天(非闰年)或 9 天(闰年)。

    因此,周总是嵌套在年中。规则#2 本身并不奇怪,但规则#1 和#3 通常是。

    我还没有遇到任何在 StataCorp 之外使用这些定义的机构,尽管第一次会很有启发性!

    其次,你的语法没有达到你想要的效果。以你的例子为例,这里遇到的问题是display 的工作是将给出的内容解释为要显示的指令,而不是准确地回显它的参数。使用macro list(并忽略不相关的细节),

    .  local week %tw 2080
    
    . mac li
    _week:          %tw 2080
    

    表明您的local 分配只是复制了您提供的文本。 display 将其视为指令,但在 display 上下文之外,格式不会咬人。将displayextended_fcnmacro 的帮助中的材料拼凑在一起,得出语法

    . local week : display %tw 2080
    
    . mac li
    _week:           2000w1
    

    应用格式并根据要求将格式设置结果放入宏中。

    更多关于display:这个序列很有启发性。

    . di "%tw 2080"
    %tw 2080
    
    . di %tw "2080"
    2080
    
    . di %tw 2080
     2000w1
    

    首先,%tw 格式作为文字字符串的一部分包含在内,因此不被视为指令。在第二种情况下,格式被忽略,因为它仅与数字参数相关,因此与 " " 以文字字符串形式呈现的内容无关。第三,你会得到你想要的。

    有关Stata周的更多信息,请参阅

    的结果
    . search week, sj
    
    Search of official help files, FAQs, Examples, SJs, and STBs
    
    SJ-12-4 dm0065_1  . . . . . Stata tip 111: More on working with weeks, erratum
            . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  N. J. Cox
            Q4/12   SJ 12(4):765                                     (no commands)
            lists previously omitted key reference
    
    SJ-12-3 dm0065  . . . . . . . . . .  Stata tip 111: More on working with weeks
            . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  N. J. Cox
            Q3/12   SJ 12(3):565--569                                (no commands)
            discusses how to convert data presented in yearly and weekly
            form to daily dates and how to aggregate such data to months
            or longer intervals
    
    SJ-10-4 dm0052  . . . . . . . . . . . . . . . . Stata tip 68: Week assumptions
            . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  N. J. Cox
            Q4/10   SJ 10(4):682--685                                (no commands)
            tip on Stata's solution for weeks and on how to set up
            your own alternatives given different definitions of the
            week
    

    如果您在 Stata 中执行此操作,您将获得相关文章的可点击链接。底线是一条建议:通过定义它们的任何每日日期来指代周,通常但不一定是一周的开始或结束。

    一个完全不同的细节是你有一个宽数据结构,这在 Stata 中通常比长数据结构更容易出现问题。

    注意:我在写这篇文章时对问题进行了编辑,因此某些部分引用了问题中不再存在的材料。

    【讨论】:

    • 很抱歉,在您已经回答问题时,我将问题缩短了这么多。我还认为星期格式会给答案带来额外的麻烦,因此我编辑了问题。
    • 你不知道我正在寻找答案。更有趣的是,如果您的数据源确实使用与 Stata 相同的星期定义,那将值得记录。
    • 我现在使用以下循环来实现我的目的,它依赖于实际的 SIF 周(因此一年中永远不会超过 52 周): foreach i of numlist 2080 { local tmp_year = 1960 + int(i'/52) local tmp_week = 1 + i' - int(i'/52)*52 di "tmp_year'w"`tmp_week'" }
    • 我会编辑您的问题,因为该代码无法清晰显示(尤其是因为 Stata 使用单引号,Stack Overflow 也是如此)。这看起来像是一个项目的循环!
    • 我的来源“有点”使用 Stata 对周的定义,因为我故意更改了日期(顺便说一句,依赖于您的文章)。但是我必须使用R 将拼写转换为宽格式以进行另一次分析...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多