20

私の目標は、開始、終了、およびデルタ (15 分、1 時間、1 日) を指定して、POSIXct タイム スタンプのベクトルを作成することです。これに使用できることを望んでいseqましたが、数値と POSIXct 表現の間の変換に問題があります。

now <- Sys.time()
now
# [1] "2012-01-19 10:30:39 CET"
as.POSIXct(as.double(now), origin="1970-01-01", tz="CET")
# [1] "2012-01-19 09:30:39 CET"
as.POSIXct(as.double(now), origin=as.POSIXct("1970-01-01", tz="CET"), tz="CET")
# [1] "2012-01-19 09:30:39 CET"

この変換中に 1 時間が失われます。私は何を間違っていますか?

4

6 に答える 6

25

andクラスのスーパークラスであるseq()class のオブジェクト用のメソッドがあります。そのため、変換を行う必要はありません。"POSIXt""POSIXlt""POSIXct"

> now <- Sys.time()
> tseq <- seq(from = now, length.out = 100, by = "mins")
> length(tseq)
[1] 100
> head(tseq)
[1] "2012-01-19 10:52:38 GMT" "2012-01-19 10:53:38 GMT"
[3] "2012-01-19 10:54:38 GMT" "2012-01-19 10:55:38 GMT"
[5] "2012-01-19 10:56:38 GMT" "2012-01-19 10:57:38 GMT"
于 2012-01-19T10:53:00.457 に答える
10

POSIXct から数値に変換する場合、R はタイムゾーンを考慮しますが、常に GMT 原点からカウントを開始することに注意する必要があります。

> xgmt <- as.POSIXct('2011-01-01 14:00:00',tz='GMT')
> xest <- as.POSIXct('2011-01-01 14:00:00',tz='EST')
> (as.numeric(xgmt) - as.numeric(xest)) / 3600
[1] -5

ご覧のとおり、EST の時刻は GMT の時刻より 5 時間早いと考えられています。これは、両方のタイムゾーンの時差です。内部に保存されるのはその値です。

このas.POSIXCT()関数は、タイムゾーンを含む属性を追加するだけです。値は変更されないため、GMT 時間で表示された時刻を取得しますが、EST であることを示す属性があります。これはPOSIXct、数値から数値に移行したら、データを GMT 時間であるかのように扱う必要があることも意味します。(これはそれよりもはるかに複雑ですが、それが一般的な考え方です)。したがって、次のようにオフセットを計算する必要があります。

> nest <- as.numeric(xest)
> origin <- as.POSIXct('1970-01-01 00:00:00',tz='EST')
> offset <- as.numeric(origin)
> as.POSIXct(nest-offset,origin=origin)
[1] "2011-01-01 14:00:00 EST"

これは、ロケールのタイムゾーンに関係なく機能します (私の場合、実際には CET です)。また、タイムゾーン データの動作はシステム間で異なる場合があることに注意してください。

于 2012-01-19T12:11:47.097 に答える
8

これらのタイム ゾーンの問題は常に面倒ですが、問題は原点が間違ったタイム ゾーンで計算されていることだと思います (文字列は日付のみを指定するため)。

を使ってみてくださいorigin <- now - as.numeric(now)

lubridate::originまたは、文字列である を使用します"1970-01-01 UTC"


再び を使用した完全なソリューションlubridate

start <- now()
seq(start, start + days(3), by = "15 min")
于 2012-01-19T10:45:50.207 に答える
4

を使用する代わりにseq.POSIXtxts::timeBasedSeqを使用することもできます。これにより、シーケンスを文字列として指定できます。

library(xts)
now <- Sys.time()
timeBasedSeq(paste("2012-01-01/",format(now),"/H",sep=""))  # Hourly steps
timeBasedSeq(paste("2012-01-01/",format(now),"/d",sep=""))  # Daily steps
于 2012-01-19T14:10:30.547 に答える
4

あなたの問題に対する答えはありませんが、POSIXctオブジェクトのベクトルを作成する別の方法があります。たとえば、今からdelta_t15 分の 1000 タイムスタンプのベクトルを作成する場合は、次のようにします。

now = Sys.time()
dt = 15 * 60 # in seconds
timestamps = now + seq(0, 1000) * dt
> head(timestamps)
[1] "2012-01-19 11:17:46 CET" "2012-01-19 11:32:46 CET"
[3] "2012-01-19 11:47:46 CET" "2012-01-19 12:02:46 CET"
[5] "2012-01-19 12:17:46 CET" "2012-01-19 12:32:46 CET"

POSIXct秘訣は、秒のベクトルをオブジェクトに追加できることです。

于 2012-01-19T10:18:39.523 に答える
1

seq(from=start,to=end, by=step) を使用する必要があります。ステップでは、「日」またはアイテムからアイテムへの経過秒数を定義する整数のいずれかを使用できることに注意してください。

于 2015-11-09T15:13:09.063 に答える