web-dev-qa-db-ja.com

Rの年、月、日、日付の間で両方向に変換するにはどうすればよいですか?

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オブジェクトに追加します
  • 以下のソリューションのいずれかを使用して、年、月、日、時間を取り戻します

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

12
Hugh Perkins

ファイルやデータベースなどから日付を渡す方法はたくさんあるので、異なる順序で、または異なる区切り文字で記述されていると述べたため、入力日付を文字列は便利で便利なソリューションです。 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()を1回呼び出してから、分離文字を分割するのは、そのような操作が気に入らないためです。

_> 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の日時コードは適切に機能し、タイムゾーンの問題などのために場所が少し複雑な場合でも十分にテストされ、堅牢です。toNumerics()で使用されるイディオムは、日時をリストとして保持し、どれを覚えているかよりも直感的です。要素は0ベースです。提供された機能に基づいて構築することは、文字列変換などを回避しようとするよりも簡単に思えます。

17
Gavin Simpson

日付から年、月、日に移動するための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、monthは0ベース、mdayは1ベースであることに注意してください(POSIX標準による)

4
Hugh Perkins

私はパーティーに少し遅れていますが、整数から日付に変換するもう1つの方法は、lubridate::make_date関数です。 R for DataScienceの以下の例を参照してください。

library(lubridate)
library(nycflights13)
library(tidyverse)

a <- flights %>%
  mutate(date = make_date(year, month, day))
4
User632716