4

私は長期間の毎時の降雨量と気温のデータを持っています。時間ごとのデータから毎日の値を取得したいと思います。07:00:00から翌日の07:00:00までの日平均を検討しています。

特定の時間間隔で時間単位のデータを毎日に変換する方法を教えてください。

例:07:00:00 to 07:00:00または12:00:00 to 12:00:00

降雨データは次のようになります。

1970-01-05 00:00:00      1.0 
1970-01-05 01:00:00      1.0
1970-01-05 02:00:00      1.0
1970-01-05 03:00:00      1.0
1970-01-05 04:00:00      1.0
1970-01-05 05:00:00      3.6
1970-01-05 06:00:00      3.6
1970-01-05 07:00:00      2.2
1970-01-05 08:00:00      2.2
1970-01-05 09:00:00      2.2
1970-01-05 10:00:00      2.2
1970-01-05 11:00:00      2.2
1970-01-05 12:00:00      2.2
1970-01-05 13:00:00      2.2
1970-01-05 14:00:00      2.2
1970-01-05 15:00:00      2.2
1970-01-05 16:00:00      0.0
1970-01-05 17:00:00      0.0
1970-01-05 18:00:00      0.0
1970-01-05 19:00:00      0.0
1970-01-05 20:00:00      0.0
1970-01-05 21:00:00      0.0
1970-01-05 22:00:00      0.0
1970-01-05 23:00:00      0.0
1970-01-06 00:00:00      0.0
4

4 に答える 4

5

まず、再現性のあるデータを作成して、より良いサポートを提供できるようにします。

require(xts)
set.seed(1)
X = data.frame(When = as.Date(seq(from = ISOdatetime(2012, 01, 01, 00, 00, 00),
                                  length.out = 100, by="1 hour")),
               Measurements = sample(1:20, 100, replace=TRUE))

2012-01-01 00:00:00これで、日付がで始まり、で終わる100時間ごとの観測値を持つデータフレームができました2012-01-05 03:00:00(時刻は24時間形式です)。

次に、それをXTSオブジェクトに変換します。

X2 = xts(X$Measurements, order.by=X$When)

第三に、特定の時間枠をサブセット化する方法を学びます。

X2['T04:00/T08:00']
#                     [,1]
# 2012-01-01 04:00:00    5
# 2012-01-01 05:00:00   18
# 2012-01-01 06:00:00   19
# 2012-01-01 07:00:00   14
# 2012-01-01 08:00:00   13
# 2012-01-02 04:00:00   18
# 2012-01-02 05:00:00    7
# 2012-01-02 06:00:00   10
# 2012-01-02 07:00:00   12
# 2012-01-02 08:00:00   10
# 2012-01-03 04:00:00    9
# 2012-01-03 05:00:00    5
# 2012-01-03 06:00:00    2
# 2012-01-03 07:00:00    2
# 2012-01-03 08:00:00    7
# 2012-01-04 04:00:00   18
# 2012-01-04 05:00:00    8
# 2012-01-04 06:00:00   16
# 2012-01-04 07:00:00   20
# 2012-01-04 08:00:00    9

第4に、次のように、その情報をapply.daily必要な関数で使用します。

apply.daily(X2['T04:00/T08:00'], mean)
#                     [,1]
# 2012-01-01 08:00:00 13.8
# 2012-01-02 08:00:00 11.4
# 2012-01-03 08:00:00  5.0
# 2012-01-04 08:00:00 14.2

更新:カスタムエンドポイント

あなたの質問を読み直した後、私はあなたが望んでいたことを誤解したことがわかりました。

必ずしも深夜から深夜までではなく、24時間の平均を取りたいようです。

このためには、捨てapply.dailyて、代わりに、次のようperiod.applyにカスタムを使用する必要がありますendpoint

# You want to start at 7AM. Find out which record is the first one at 7AM.
A = which(as.character(index(X2)) == "2012-01-01 07:00:00")

# Use that to create your endpoints. 
# The ends of the endpoints should start at 0 
# and end at the max number of records.
ep = c(0, seq(A, 100, by=24), 100)
period.apply(X2, INDEX=ep, FUN=function(x) mean(x))
#                         [,1]
# 2012-01-01 07:00:00 12.62500
# 2012-01-02 07:00:00 10.08333
# 2012-01-03 07:00:00 10.79167
# 2012-01-04 07:00:00 11.54167
# 2012-01-05 03:00:00 10.25000
于 2012-07-19T08:51:04.017 に答える
2

あなたはこのコードをすることができます:

fun <- function(s,i,j) { sum(s[i:(i+j-1)]) }
sapply(X=seq(1,24*nb_of_days,24),FUN=fun,s=your_time_serie,j=24)

07:00:00 to 07:00:00時間間隔を変えるには、 1を別の値に変更する必要があります。12:00:00 to 12:00:00

于 2012-07-19T08:45:52.470 に答える
1

ステップ1:日付をPOSIXctに変換する

ttt <- as.POSIXct("1970-01-05 08:00:00",tz="GMT")
ttt
#"1970-01-05 08:00:00 GMT"

ステップ2:7時間のdifftimeを差し引く

ttt <- ttt-as.difftime(7,units="hours")
ttt
#"1970-01-05 01:00:00 GMT"

ステップ3:数日に切り詰める

ttt<-trunc(ttt,"days")
ttt
#"1970-01-05 GMT"

ステップ4:plyr、data.table、または任意の方法を使用して、毎日の平均を計算します

于 2012-07-19T08:41:45.823 に答える
0

正規表現を使用すると、必要なものが得られるはずです。ニーズに一致する行を選択し、値を合計します。あなたの時間範囲内の毎日のためにこれをしてください、そしてあなたは準備ができています。

于 2012-07-19T08:25:51.890 に答える