【问题标题】:Stata: Number of Months between Two DatesStata:两个日期之间的月数
【发布时间】:2021-02-24 17:29:48
【问题描述】:

我想创建一个变量,它给出我的数据集中两个每日日期变量(end_date 和 start_date)之间的月数。如果开始日期是该月的第一天,我想计算开始日期的月份,同样,如果它是该月的最后一天,我想计算结束日期的月份。

例如,假设 start_date 是 01feb2010,end_date 是 12jun2010。我想计算二月和二月到六月之间的月份,而不是六月。所以,总共 4 个月。

【问题讨论】:

    标签: date stata


    【解决方案1】:

    扩展@Cyber​​nike 的有用答案:

    您似乎想要一个开始日期和另一个结束日期之间的完整月数。通过mofd() 推送每日日期并获得差异是答案的基础,除了我们通常需要加 1,但也需要减 1,除非结束日期是该月的最后一天。

    跟我重复:当月的最后一天是下个月第一天的前一天。下个月的第一天很容易找到,然后你需要做的就是减1以获得当月最后一天的每日日期。无需检查不同的月份长度,31、30、29 或 28 天。有一篇关于这个主题的论文。见here

    clear
    input float(start end)
    18294 18425
    18294 18659
    18294 18440
    18294 18474 
    18295 18474 
    end
    
    gen end2 = dofm(mofd(end) + 1) - 1 
    
    gen start2 = dofm(mofd(start))
    
    format %td start* end*
    
    gen wanted1 = mofd(end) - mofd(start) + 1 - (end2 != end)
    
    gen wanted2 = mofd(end) - mofd(start) + 1 - (start2 != start) - (end2 != end)
    
    list 
     
         +-------------------------------------------------------------------+
         |     start         end        end2      start2   wanted1   wanted2 |
         |-------------------------------------------------------------------|
      1. | 01feb2010   12jun2010   30jun2010   01feb2010         4         4 |
      2. | 01feb2010   01feb2011   28feb2011   01feb2010        12        12 |
      3. | 01feb2010   27jun2010   30jun2010   01feb2010         4         4 |
      4. | 01feb2010   31jul2010   31jul2010   01feb2010         6         6 |
      5. | 02feb2010   31jul2010   31jul2010   01feb2010         6         5 |
         +-------------------------------------------------------------------+
    
    
     
    

    但是,您的问题存在歧义。开始日期可能不是该月的第一天吗?如果是这样,那么您是否也需要检查这种情况?请参阅wanted2 以获得更严格的解决方案。

    【讨论】:

    • 这是一个更强大的解决方案,但我认为wanted 的值略有偏差。第一行和第二行的 wanted 值应分别为 4 和 12。例如,第一行应计算 2 月、3 月、4 月、5 月,总共 4 个月。还是我对这个问题的解释不同?
    • 很好发现,非常感谢。现在修好了,我希望。
    【解决方案2】:

    这是一个非常粗略的解决方案:

    gen diff_days = end_date - start_date
    gen diff_months = floor(diff_days/30.437)
    
    list
    
         +---------------------------------------------+
         | start_d~e    end_date   diff_d~s   diff_m~s |
         |---------------------------------------------|
      1. | 01feb2010   12jun2010        131          4 |
      2. | 01feb2010   01feb2011        365         12 |
      3. | 01feb2010   27jun2010        146          4 |
         +---------------------------------------------+
    

    可能有更好的方法来做到这一点。请注意,平均日历月长度为 30.437 天。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-01
      • 2017-08-06
      • 2019-03-28
      • 2011-06-06
      相关资源
      最近更新 更多