[R] transforming dates

David Winsemius dw|n@em|u@ @end|ng |rom comc@@t@net
Sun Nov 3 21:22:22 CET 2019


On 11/3/19 11:51 AM, Bert Gunter wrote:
> Rui is right -- lubridate functionality and robustness is better -- but
> just for fun, here is a simple function, poorly named reformat(), that
> splits up the date formats, cleans them up and standardizes them a bit, and
> spits them back out with a sep character of your choice (your original
> split and recombine suggestion). Lubridate probably does something similar
> but more sophisticated, but maybe it's worthwhile to see how one can do it
> using basic functionality. This only requires a few short lines of code.

If one wants to investigate existing efforts at automatic date _and_ 
time reformatting, then do not forget Dirk's anytime package:


https://cran.r-project.org/web/packages/anytime/index.html


-- 

David.

>
> reformat <- function(z, sep = "-"){
>     z <- gsub(" ","",z) ## remove blanks
>     ## break up dates into 3 component pieces and convert to matrix
>     z <- matrix(unlist(strsplit(z, "-|/")), nrow = 3)
>     ## add "0" in front of single digit in dd and mm
>     ## add "20" in front  of "yy"
>     for(i in 1:2) z[i, ] <- gsub("\\<([[:digit:]])\\>","0\\1",z[i, ])
>     z[3, ] <- sub("\\<([[:digit:]]{2})\\>","20\\1",z[3, ])
>     ## combine back into single string separated by sep
>     paste(z[1, ],z[2, ],z[3, ], sep = sep)
> }
>
> ## Testit
>> z <- c(" 1 / 22 /2015"," 1 -5 -15","11/7/2016", "14-07-16")
>> reformat(z)
> [1] "01-22-2015" "01-05-2015" "11-07-2016" "14-07-2016"
>
>> reformat(z,"/")
> [1] "01/22/2015" "01/05/2015" "11/07/2016" "14/07/2016"
>
> Bert Gunter
>
> "The trouble with having an open mind is that people keep coming along and
> sticking things into it."
> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
>
>
> On Sun, Nov 3, 2019 at 12:15 AM Rui Barradas <ruipbarradas using sapo.pt> wrote:
>
>> Hello,
>>
>> I believe the simplest is to use package lubridate. Its functions try
>> several formats until either one is right or none fits the data.
>>
>> x <- c('11/7/2016', '14-07-16')
>> lubridate::dmy(x)
>> #[1] "2016-07-11" "2016-07-14"
>>
>>
>> The order dmy must be the same for all vector elements, if not
>>
>> y <- c('11/7/2016', '14-07-16', '2016/7/11')
>> lubridate::dmy(y)
>> #[1] "2016-07-11" "2016-07-14" NA
>> #Warning message:
>> # 1 failed to parse.
>>
>>
>> Hope this helps,
>>
>> Rui Barradas
>>
>> Às 02:25 de 03/11/19, reichmanj using sbcglobal.net escreveu:
>>> R-Help Forum
>>>
>>>
>>>
>>> I have a data set that contains a date field but the dates are in two
>>> formats
>>>
>>>
>>>
>>> 11/7/2016            dd/mm/yyyy
>>>
>>> 14-07-16               dd-mm-yy
>>>
>>>
>>>
>>> How would I go about correcting this problem. Should I separate the
>> dates,
>>> format them , and then recombine?
>>>
>>>
>>>
>>> Sincerely
>>>
>>>
>>>
>>> Jeff Reichman
>>>
>>> (314) 457-1966
>>>
>>>
>>>
>>>
>>>        [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list