[R] Remove 100 years from a date object

Clint Bowman clint at ecy.wa.gov
Fri Dec 10 17:27:33 CET 2010


There still may be a problem if the dates go back far enough, e.g., 
1909.  Is '09' 1909 or 2009?  No matter what, you have to decide 
which values need 1900 added and which need 2000.  I'd split the 
date on the delimiter '.', decide whether to add 1900 or 2000, and 
then paste them together and then as.Date().

Clint

-- 
Clint Bowman			INTERNET:	clint at ecy.wa.gov
Air Quality Modeler		INTERNET:	clint at math.utah.edu
Department of Ecology		VOICE:		(360) 407-6815
PO Box 47600			FAX:		(360) 407-7534
Olympia, WA 98504-7600


         USPS:           PO Box 47600, Olympia, WA 98504-7600
         Parcels:        300 Desmond Drive, Lacey, WA 98503-1274


On Fri, 10 Dec 2010, Barry Rowlingson wrote:

> On Fri, Dec 10, 2010 at 3:27 PM, Daniel Brewer <daniel.brewer at icr.ac.uk> wrote:
>> Hello,
>>
>> I have some data that has dates in the form 27.02.37.  I convert them to
>> a date object as follows:
>> as.Date(data$date,format="%d.%m.%y")
>>
>> But this gives me years such as 2037 when I would like them to be 1937.
>>  I thought of trying to take off some time i.e.
>> as.Date(camCD$DoB,format="%d.%m.%y") - 100*365
>> But that doesn't seem to work out correctly.  Any ideas how to do this?
>
> Normally to adjust dates you can use as.difftime() and do arithmetic,
> but a year is a variable thing (can be 365 or 366 days) so you cant
> make a difftime of years. Days are variable things if you worry about
> leap seconds...
>
> Also, you could end up with an invalid date if you have 29-Feb-2000
> and 29-Feb-1900. One wasn't a leap year...
>
> A solution minus those caveats is to convert to POSIXlt and adjust the
> $year element:
>
> > dob="27.02.37"
> > as.Date(dob,format="%d.%m.%y")
> [1] "2037-02-27"
> > dobp = as.POSIXlt(as.Date(dob,format="%d.%m.%y"))
> > dobp$year = dobp$year - 100
>
> > dobp
> [1] "1937-02-27 UTC"
> > as.Date(dobp)
> [1] "1937-02-27"
>
> although it might be easier to paste a '19' into your character variable
>
> > paste(substr(dob,1,6),"19",substr(dob,7,9),sep="")
> [1] "27.02.1937"
>
> and then do it the way you started. Assumes you have leading zeroes on
> all fields though.
>
> Barry
>
> ______________________________________________
> R-help at r-project.org mailing list
> 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