16

Rで年、月、日、日付を変換する方法は?

文字列を介してこれを行うことができることは知っていますが、パフォーマンスが低下する可能性があるため、文字列への変換は避けたいと思います。 」と、「年-日-月」を使用するものもあります。

ISODate は年、月、日 -> DateTime の方向を提供しているように見えますが、最初に数値を文字列に変換するため、文字列を経由しない方法がある場合は優先します。

日時から数値まで、逆のことは何も見つかりませんでしたか? strsplit などを使用する必要はありません。

編集:明確にするために、私が持っているのは、次のようなデータフレームです:

year month day hour somevalue
2004 1     1   1   1515353
2004 1     1   2   3513535
....

この形式に自由に変換できるようにしたい:

time(hour units) somevalue
1             1515353
2             3513535
....

...そしてまた戻ることができます。

編集:「時間」(時間単位)が何を意味するのかについての混乱を解消するために、最終的に私がしたことは、Rで2つの日付の違いを時間で見つける方法からの情報を使用して? :

前方方向:

lh$time <- as.numeric( difftime(ISOdate(lh$year,lh$month,lh$day,lh$hour), ISOdate(2004,1,1,0), units="hours"))
lh$year <- NULL; lh$month <- NULL; lh$day <- NULL; lh$hour <- NULL

逆方向:

...まあ、私はまだ後方に行っていませんが、次のようなものを想像しています:

  • lh$time から difftime オブジェクトを作成します (どういうわけか...)
  • ISOdate(2004,1,1,0) を difftime オブジェクトに追加します
  • 以下の解決策のいずれかを使用して、年、月、日、時間を元に戻します

将来的には、解決しようとしている問題を正確に尋ねることができると思いますが、特定の問題を一般的な再利用可能な質問に因数分解しようとしていましたが、それは間違いでしたか?

4

3 に答える 3

24

ファイル、データベースなどから日付を渡す方法は非常に多く、異なる順序または異なる区切り記号で記述されているという理由から、入力された日付を文字列として表すことは便利で便利です解決。R は実際の日付を文字列として保持しないため、それらを操作するためにそれらを文字列として処理する必要はありません。

内部的には、R はオペレーティング システムを使用してこれらのことを標準的な方法で実行しています。文字列を操作する必要はまったくありません。おそらく、いくつかのものを文字から数値に相当するものに変換するだけです。たとえば、両方の操作 (前方および後方) をデプロイ可能な単純な関数にまとめるのは非常に簡単です。

toDate <- function(year, month, day) {
    ISOdate(year, month, day)
}

toNumerics <- function(Date) {
    stopifnot(inherits(Date, c("Date", "POSIXt")))
    day <- as.numeric(strftime(Date, format = "%d"))
    month <- as.numeric(strftime(Date, format = "%m"))
    year <- as.numeric(strftime(Date, format = "%Y"))
    list(year = year, month = month, day = day)
}

strptime()この種の操作が気に入らないため、分離文字の単一の呼び出しとその後の分割は控えます。

> toDate(2004, 12, 21)
[1] "2004-12-21 12:00:00 GMT"
> toNumerics(toDate(2004, 12, 21))
$year
[1] 2004

$month
[1] 12

$day
[1] 21

内部的には、R の datetime コードは適切に機能し、タイムゾーンの問題などの理由で場所によっては少し複雑な場合でも、十分にテストされ、堅牢です。toNumerics()日付時刻をリストとして使用し、どの要素が 0 ベースであるかを覚えておくよりも、使用されるイディオムがより直感的であることがわかります。提供された機能を構築することは、文字列変換などを回避しようとするよりも簡単に思えます。

于 2012-10-19T15:29:20.797 に答える
4

日付から年、月、日に移動するための1つの解決策が見つかりました。

ISOdate を使用してここで作成する日付オブジェクトがあるとします。

somedate <- ISOdate(2004,12,21)

次に、これの数値コンポーネントを次のように取得できます。

unclass(as.POSIXlt(somedate))

与えます:

$sec
[1] 0

$min
[1] 0

$hour
[1] 12

$mday
[1] 21

$mon
[1] 11

$year
[1] 104

次に、たとえば必要なものを取得できます。

unclass(as.POSIXlt(somedate))$mon

$year は [実際の年] - 1900、月は 0 ベース、mday は 1 ベースであることに注意してください (POSIX 標準に従って)

于 2012-10-19T14:47:12.953 に答える