2016-07-26 11 views
0

私はRでdatetimeのものを使いこなしています。古い日付を受け入れるように時間原点を変更する方法を理解することはできません。たとえば:datetimeオブジェクトであいまいな世紀を扱うにはどうすればよいですか?

vals <- as.character(60:70) 
as.POSIXct(vals, origin="1900-01-01", format = "%y") 
# [1] "2060-07-25 EDT" "2061-07-25 EDT" "2062-07-25 EDT" "2063-07-25 EDT" 
# [5] "2064-07-25 EDT" "2065-07-25 EDT" "2066-07-25 EDT" "2067-07-25 EDT" 
# [9] "2068-07-25 EDT" "1969-07-25 EDT" "1970-07-25 EDT" 

はそれがas.POSIXctが「60」の入力のための1960を返すことなの原点を調整することは可能ですか?あいまいな世紀を処理する最良の方法は何ですか?

答えて

1

は、入力が"60"の場合、1960を返すことはできません。 ?strptimeを参照してください:

‘%y’ Year without century (00-99). On input, values 00 to 68 are 
     prefixed by 20 and 69 to 99 by 19 - that is the behaviour 
     specified by the 2004 and 2008 POSIX standards, but they do 
     also say ‘it is expected that in a future version the default 
     century inferred from a 2-digit year will change’. 

あなたは文字列に世紀を付加し、あなたがas.POSIXctと異なる動作をする場合は"%Y"形式を使用する必要があります。

vals <- as.character(60:70) 
as.POSIXct(paste0("19",vals), format = "%Y") 

2桁の日付の一部は2000年以降であれば、あなたは別の世紀を付加するifelseまたは類似のものを使用することができます。

newvals <- paste0(ifelse(vals < "20", "20", "19"), vals) 
+0

私はそれを読んだ - 私はちょうどデフォルト動作を変更する方法があると仮定した。 – dayne

+0

@dayne:通常、国際基準に準拠する行動を破壊する方法はありません。 –

1

2000年を超える場合は、ベクターに19をプリペンドすることは望ましくない場合があります。

この場合、100年を引いた方が良いかもしれません。

library(lubridate) 
vals <- as.character(60:70) 
vals <- as.POSIXct(vals, origin="1900-01-01", format = "%y") 
vals[year(vals)>2059] <- vals[year(vals)>2059] - years(100) 
vals 

[1] "1960-07-25 CDT" "1961-07-25 CDT" "1962-07-25 CDT" 
[4] "1963-07-25 CDT" "1964-07-25 CDT" "1965-07-25 CDT" 
[7] "1966-07-25 CDT" "1967-07-25 CDT" "1968-07-25 CDT" 
[10] "1969-07-25 CDT" "1970-07-25 CDT" 
+0

賢いハック。私はまだ 'lubridate'パッケージを見ていません。 – dayne

+0

ハドレーと一緒に学んだ私たちの多くは、ベースRよりもベイヤーレスをよく知っています。「潤滑油」は良いものです。 – shayaa

+1

これは、POSIX標準が変更されずに残っている場合にのみ有効ですが、 '?strptime'は将来何らかの時点で変更されることが予想されます。 –

関連する問題