Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.

# Re: st: RE: dates

 From Nick Cox To statalist@hsphsun2.harvard.edu Subject Re: st: RE: dates Date Sun, 9 Oct 2011 14:37:00 +0100

```As you say, and as I implied, "month" here  is in the sense of Stata
monthly date, as returmed by -mofd()-,  not month of year alone.

Nick

On Sun, Oct 9, 2011 at 1:48 PM, Steven Samuels <sjsamuels@gmail.com> wrote:

> The one-step solution is very neat! I wasn't even aware of  of -dofm- . But substituting the month for -mofd- won't do because information on year is missing  In the original one-step formula, substitute for "visdate"  any date in the visit month, e.g. the first:
>
> day(dofm(1 + mofd(mdy(vmonth,1,vyear)))-1)
>
>
> Steve
>
>
> On Oct 7, 2011, at 8:01 AM, Nick Cox wrote:
>
> In this particular problem you don't have a daily date, but just use the month instead of the result of -mofd()-.
>
> Nick
> n.j.cox@durham.ac.uk
>
> Nick Cox
>
> Suppose -visdate- as here is a daily date variable.
>
> Then the length of the current month is given by the last day of the
> current month, which is given by the first day of the next month less
> 1.
>
> day(dofm(1 + mofd(visdate)) - 1)
>
> In steps:
>
> 1. current month is mofd(visdate)
> 2. next month is 1 + mofd(visdate)
> 3. first day of next month is dofm(1 + mofd(visdate))
> 4. last day of this month is dofm(1 + mofd(visdate)) - 1
> 5. day of last day ... you got it long since.
>
> But I never remember most of the function names and always have to
> look them up.
>
> It's key _never_ to type in rules about 28/31 or leap years, because
>
> Nick
>
> On Thu, Oct 6, 2011 at 11:55 PM, Steven Samuels <sjsamuels@gmail.com> wrote:
>> Oops! The original algorithm assigned days only from 1 to 15. The correction is below.  A better version  would assign days according to whether the month has 28, 29, 30, or 31 days, but I'll leave that to others.
>>
>>
>> Steve
>>
>>
>>
>> With enough missing dates  it might be better to randomly assign a day of the month, or you risk distorting the distribution of inter-visit intervals.
>>
>>
>>
>>
>> *********************************
>> clear
>> input str10 date
>> 200801
>> 20080113
>> end
>> set seed 21932
>> gen visdate = date(date, "YMD")
>> tempvar day
>> gen str2 `day' = string(ceil(30*runiform())) if length(date)==6
>> replace `day' = "0"+`day' if real(`day')<10
>> gen fakeday = (length(date)==6)
>> replace visdate = date(date + `day', "YMD") if length(date)==6
>> format visdate %td
>> list date visdate fakeday
>> *****************************
>>
>>
>>
>> On Oct 6, 2011, at 5:46 PM, Michael Eisenberg wrote:
>>
>> Thanks so much.
>>
>> On Thu, Oct 6, 2011 at 8:23 AM, Nick Cox <n.j.cox@durham.ac.uk> wrote:
>>> You don't say what "without success" means precisely.
>>>
>>> "200801" does not match either date pattern. If there is no information on day of month, Stata can only return missing for a daily date.
>>>
>>> -date("200801" + "15", "YMD")- seems to be the most common fudge. I would always tag such guessed dates with an indicator variable.
>>>
>>> Nick
>>> n.j.cox@durham.ac.uk
>>>
>>> Michael Eisenberg
>>>
>>> I have a list of visit dates for patients.  Unfortunately, the format
>>> is not constant.
>>>
>>> Most are listed with the year, month, day such as 20080105 for Jan 5,
>>> 2008 but some are listed only with the year and month 200801 for Jan
>>> 2008.
>>>
>>> I attempted to convert them into stata dates with the commands below
>>> without success.
>>>
>>> gen ndate = date(dx_date, "YMD")
>>> or
>>> gen ndate = date(dx_date, "CCYYNNDD")
>>>
>>> Can stata handle such inconsistent data?
>>>
>>>

*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/
```