查找不同年份的月份的最后日期

时间:2019-04-30 15:48:16

标签: stata

我有一个包含年份和月份的字符串变量:

clear

input str6 year
"2012m5"
"2013m9"
"2014m10"
"2015m12"
"2016m2"
"2017m8"
"2018m6"
end

当我应用previous question of mine中提供的解决方案时,结果没有意义:

g date = dofy(monthly(year, "YM") + 1 ) - 1
form date %td 

l

     +--------------------+
     |   year        date |
     |--------------------|
  1. | 2012m5   31dec0628 |
  2. | 2013m9   31dec0644 |
  3. | 2014m1   31dec0648 |
  4. | 2015m1   31dec0660 |
  5. | 2016m2   31dec0673 |
     |--------------------|
  6. | 2017m8   31dec0691 |
  7. | 2018m6   31dec0701 |
     +--------------------+

有任何想法为什么会这样?

2 个答案:

答案 0 :(得分:1)

您需要改用dofm()函数:

generate wanted = dofm(monthly(year, "YM") + 1) - 1 
format wanted %td 

list, separator(0)


     +--------------------+
     |   year      wanted |
     |--------------------|
  1. | 2012m5   31may2012 |
  2. | 2013m9   30sep2013 |
  3. | 2014m1   31jan2014 |
  4. | 2015m1   31jan2015 |
  5. | 2016m2   29feb2016 |
  6. | 2017m8   31aug2017 |
  7. | 2018m6   30jun2018 |
     +--------------------+

答案 1 :(得分:1)

@PearlySpencer专注于做什么。在这里,我重点介绍代码中的错误。简单的命令使您可以查看已完成的操作并找出错误所在。

clear 
input str6 year
"2012m5"
"2013m9"
"2014m10"
"2015m12"
"2016m2"
"2017m8"
"2018m6"
end

generate step1 = monthly(year, "YM") 

list, sep(0) 

     +----------------+
     |   year   step1 |
     |----------------|
  1. | 2012m5     628 |
  2. | 2013m9     644 |
  3. | 2014m1     648 |
  4. | 2015m1     660 |
  5. | 2016m2     673 |
  6. | 2017m8     691 |
  7. | 2018m6     701 |
     +----------------+

monthly()函数以0为1960年1月的比例生成每月日期。

首先添加1,然后再减去1不会对主要错误产生任何实质性的影响,主要错误是将结果提供给dofy(),该日期预计为一年(日期)作为输入,并产生每日日期作为输出。这就是为什么您多年来错误地获取每日约会的原因。