【发布时间】:2021-02-24 17:29:48
【问题描述】:
我想创建一个变量,它给出我的数据集中两个每日日期变量(end_date 和 start_date)之间的月数。如果开始日期是该月的第一天,我想计算开始日期的月份,同样,如果它是该月的最后一天,我想计算结束日期的月份。
例如,假设 start_date 是 01feb2010,end_date 是 12jun2010。我想计算二月和二月到六月之间的月份,而不是六月。所以,总共 4 个月。
【问题讨论】:
我想创建一个变量,它给出我的数据集中两个每日日期变量(end_date 和 start_date)之间的月数。如果开始日期是该月的第一天,我想计算开始日期的月份,同样,如果它是该月的最后一天,我想计算结束日期的月份。
例如,假设 start_date 是 01feb2010,end_date 是 12jun2010。我想计算二月和二月到六月之间的月份,而不是六月。所以,总共 4 个月。
【问题讨论】:
扩展@Cybernike 的有用答案:
您似乎想要一个开始日期和另一个结束日期之间的完整月数。通过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 个月。还是我对这个问题的解释不同?
这是一个非常粗略的解决方案:
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 天。
【讨论】: