How to properly convert, achieve the equivalence of dates

How to properly convert, achieve the equivalence of dates
How to achieve the expected value with the functions to manipulate dates, used in each data.table.
In the case of as.Date, I have varied the origin without achieving the expected result
What to do?
On many occasions I find this numerical format of dates!
the 20200402 format is used on this site

library(data.table)
dt<-as.data.table(list(
                       yr = c(14610, 14975, 15340, 15706, 16071, 16436, 16801, 17167, 
                              17532, 17897, 18262, 18628, 18993, 19358, 19723, 20089,
                              20454, 20819, 21184, 21550, 21915, 22280, 22645, 23011, 
                              23376, 23741, 24106, 24472, 24837, 25202, 25567, 25933, 
                              26298, 26663, 27028, 27394, 27759,  28124, 28489, 28855)))
#help as.Date {base}
## date given as number of days since 1900-01-01 (a date in 1989)
#as.Date(32768, origin = "1900-01-01")
dt[,`:=`(expected=as.IDate(yr),date=as.Date(yr,origin = "1900-01-01")),]
print(dt,topn=3)
      yr   expected       date
 1: 14610 2010-01-01 1940-01-02
 2: 14975 2011-01-01 1941-01-01
 3: 15340 2012-01-01 1942-01-01
---                            
38: 28124 2047-01-01 1977-01-01
39: 28489 2048-01-01 1978-01-01
40: 28855 2049-01-01 1979-01-02

dt2<-as.data.table(list(
  yr = c(20200327,20200327,20200327,20200327,20200327,20200327,20200327,20200327,20200327,
         20200327,20200327,20200327,20200327,20200327,20200327,20200327,20200327,20200327,
         20200327,20200327,20200327)))
dt2[,`:=`(expected=lubridate::ymd(yr),idate=as.IDate(yr),date=as.Date(yr,origin = "1900-01-01")),]
print(dt2,topn=3)
         yr   expected       idate        date
 1: 20200327 2020-03-27 57276-08-13 57206-08-14
 2: 20200327 2020-03-27 57276-08-13 57206-08-14
 3: 20200327 2020-03-27 57276-08-13 57206-08-14
---                                            
19: 20200327 2020-03-27 57276-08-13 57206-08-14
20: 20200327 2020-03-27 57276-08-13 57206-08-14
21: 20200327 2020-03-27 57276-08-13 57206-08-14
 

Try 1970
Or use lubridate? You second example shows you had success using lubridate already.

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.

Do these work for you?

library(data.table)
dt<-as.data.table(list(
  yr = c(14610, 14975, 15340, 15706, 16071, 16436, 16801, 17167, 
         17532, 17897, 18262, 18628, 18993, 19358, 19723, 20089,
         20454, 20819, 21184, 21550, 21915, 22280, 22645, 23011, 
         23376, 23741, 24106, 24472, 24837, 25202, 25567, 25933, 
         26298, 26663, 27028, 27394, 27759,  28124, 28489, 28855)))
dt[,`:=`(expected=as.IDate(yr),date=as.Date(yr,origin = "1970-01-01")),]
print(dt,topn=3)
#>        yr   expected       date
#>  1: 14610 2010-01-01 2010-01-01
#>  2: 14975 2011-01-01 2011-01-01
#>  3: 15340 2012-01-01 2012-01-01
#> ---                            
#> 38: 28124 2047-01-01 2047-01-01
#> 39: 28489 2048-01-01 2048-01-01
#> 40: 28855 2049-01-01 2049-01-01

dt2<-as.data.table(list(
  yr = c(20200327,20200327,20200327,20200327,20200327,20200327,20200327,20200327,20200327,
         20200327,20200327,20200327,20200327,20200327,20200327,20200327,20200327,20200327,
         20200327,20200327,20200327)))
dt2[,`:=`(expected=lubridate::ymd(yr),idate=as.IDate(as.character(yr),format="%Y%m%d"),
          date=as.Date(as.character(yr),format="%Y%m%d")),]
print(dt2,topn=3)
#>           yr   expected      idate       date
#>  1: 20200327 2020-03-27 2020-03-27 2020-03-27
#>  2: 20200327 2020-03-27 2020-03-27 2020-03-27
#>  3: 20200327 2020-03-27 2020-03-27 2020-03-27
#> ---                                          
#> 19: 20200327 2020-03-27 2020-03-27 2020-03-27
#> 20: 20200327 2020-03-27 2020-03-27 2020-03-27
#> 21: 20200327 2020-03-27 2020-03-27 2020-03-27

Created on 2020-04-03 by the reprex package (v0.3.0)