rで日付の開始/終わりのデータタイムの配列を作成する
-
28-10-2019 - |
質問
ZooとChronを使用して時系列分析を行うためにRを使用しています。私はそこにたくさんのデータを含む動物園オブジェクトを持っています、そして window
データをたった1日間の価値をサブセットし、次の日の価値があり、次の日などに機能します。
私は、特定の期間に毎日の日付でアレイを作成する最も簡単な方法を見つけようとしましたが、以下を思いつきました。
orig = c(month=1, day=1, year=2005)
dates <- chron(1:1825, origin=orig, out.format=c(dates="d/m/y", times="h:m"))
これはジュリアンデーの表記を使用し、1825日(365*5-5年)があり、日付の最初の日から始まります。次に、この配列の各要素を使用して、ループを実行しようとします。
for (date in dates)
{
s = chron(date, "00:00:00", origin=orig)
e = chron(date, "23:59:59", origin=orig)
aeronet_day = window(aeronet, start=s, end=e)
}
しかし、これは私が異なる起源を使用しているという警告を与えてくれます aeronet
動物園オブジェクトと s
と e
変数、およびデータは選択しません。
これを行うためのより良い方法はありますか?またはこれを修正する方法は?基本的に私が欲しいのは、ループで使用できる場所でループ用に実行することです。 aeronet_day = window(aeronet, start=s, end=e)
1日間データを含む動物園オブジェクトを作成するコード(たとえば、2005年5月1日00:00:00から23:59:59まで。
解決
このデータがあるとします。
# create test data
library(zoo)
library(chron)
z <- zooreg(1:30, start = chron("2000-01-01"), freq = 2)
1)集計r aggregate
機能には動物園法があります。 2番目の議論は、私たちが集計するものです。関数の場合、動物園オブジェクトのインデックスに適用されます。たとえば、各日付の平均を計算します。
z.ag <- aggregate(z, as.Date, mean)
交換できます mean
必要に応じて、より複雑な機能を備えています。
2)分割. 。 r split
機能には動物園法があります。本当に分裂したいなら z
日付までに、これを行うことができます。ここ z.split.list
リストであり、各コンポーネントには1つの日付の動物園オブジェクトが含まれています。
z.split.list <- split(z, as.Date(time(z)))
今(a) sapply
または(b) lapply
そのリストを介して、または(c)以下を使用します(交換 print(zc)
どんな処理でも必要なものがあります)。ここ zc
リストのコンポーネントです。つまり、特定の日付を取得するだけで形成される動物園オブジェクトです。
for(zc in z.split.list) print(zc)
ご了承ください as.Date(time(z))
zの要素に対応する日付を持つベクトルです。
編集:
さまざまな軽微な精巧。
他のヒント
私は動物園に精通していませんが、通常、日付を数値に変換してから、シーケンスを作成してから、再び変換します。例えば:
> as.Date(Sys.Date():(Sys.Date()+365), origin='1970-01-01')
[1] "2011-12-06" "2011-12-07" "2011-12-08" "2011-12-09" "2011-12-10" "2011-12-11" "2011-12-12" "2011-12-13"
[9] "2011-12-14" "2011-12-15" "2011-12-16" "2011-12-17" "2011-12-18" "2011-12-19" "2011-12-20" "2011-12-21"
[17] "2011-12-22" "2011-12-23" "2011-12-24" "2011-12-25" "2011-12-26" "2011-12-27" "2011-12-28" "2011-12-29"
[25] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04" "2012-01-05" "2012-01-06"
[33] "2012-01-07" "2012-01-08" "2012-01-09" "2012-01-10" "2012-01-11" "2012-01-12" "2012-01-13" "2012-01-14"
[41] "2012-01-15" "2012-01-16" "2012-01-17" "2012-01-18" "2012-01-19" "2012-01-20" "2012-01-21" "2012-01-22"
...
日付ごとに何かをしたいのなら、あなたが持っているものは大丈夫です。
いくつかのサンプル aeronet
データ。
last_date <- 1825
n <- 10000
aeronet <- data.frame(
some.value = seq_len(n),
date = as.chron(
runif(n, 0, last_date),
origin = orig,
out.format = c(dates = "d/m/y", times = "h:m")
)
)
これで、データを使用して日付ごとに分割できます split
, 、または各日付に関数を適用します tapply
また ddply
から plyr
(または使用します aggregate
または何でも)。
with(aeronet, split(some.value, date))
with(aeronet, tapply(some.value, date, sum))
library(plyr)
ddply(aeronet, .(date), summarise, sum(some.value))