web-dev-qa-db-ja.com

最高(最新)および最低(最古)の日付を見つける方法[R]

データフレームの2つの列を「良い」日付と時刻のクラスに変換しようとしていますが、これまであまり成功していませんでした。さまざまなクラス(timeDateDatetimeSeriesPOSIXctPOSIXlt)を試しましたが、成功しませんでした。おそらく、私は明らかなことを見落としているだけであり、非常に多くのアプローチを試みたので、何が何であるかもうわかりません。皆さんの何人かが、私が間違っているところに光を当てることができることを願っています。

目標:最も早い日付と最も遅い日付を使用して、2つの日付の差を計算します。 head()tail()でこれを機能させましたが、データの最も早い日付と最新の日付ではこれらの値は必要ないため、別の方法が必要です。 (データのソートは日付の日にのみ行われるため、データのソートが機能しません。)

2番目の目標:日付を日次形式(2010年8月12日)から週次、月次、および年次レベル(「49-2010」、「12月10日」、ちょうど「2010」)。これは、フォーマット設定(%d-%m-%y)。これは、data.frameを時間クラスに変換し、適切な形式(8-12-2010 -> format("%B-%y") -> 'december-10')、その後、その時間クラスを各月のレベルを持つ因子に変換しますか?

両方の目標のために、何らかの方法で日付フレームを時間クラスに変換する必要があり、ここでいくつかの困難に直面しました。

私のデータフレームは次のようになります。

> tradesList[c(1,10,11,20),14:15] -> tmpTimes4
> tmpTimes4
   EntryTime ExitTime
1   01-03-07 10-04-07
10  29-10-07 02-11-07
11  13-04-07 14-05-07
20  18-12-07 20-02-08

私が試したことの概要は次のとおりです。

> class(tmpTimes4)
[1] "data.frame"
> as.Date(head(tmpTimes4$EntryTimes, n=1), format="%d-%m-%y")
Error in as.Date.default(head(tmpTimes4$EntryTimes, n = 1), format = "%d-%m-%y") : 
  do not know how to convert 'head(tmpTimes4$EntryTimes, n = 1)' to class "Date"
> as.timeDate(tmpTimes4, format="%d-%m-%y")
Error in as.timeDate(tmpTimes4, format = "%d-%m-%y") : 
  unused argument(s) (format = "%d-%m-%y")
> timeSeries(tmpTimes4, format="%d-%m-%y")
Error in midnightStandard2(charvec, format) : 
  'charvec' has non-NA entries of different number of characters
> tmpEntryTimes4 <- timeSeries(tmpTimes4$EntryTime, format="%d-%m-%y")
> tmpExitTimes4 <- timeSeries(tmpTimes4$ExitTime, format="%d-%m-%y")
> tmpTimes5 <- cbind(tmpEntryTimes4,tmpExitTimes4)
> colnames(tmpTimes5) <- c("Entry","Exit")
> tmpTimes5
     Entry    Exit    
[1,] 01-03-07 10-04-07
[2,] 29-10-07 02-11-07
[3,] 13-04-07 14-05-07
[4,] 18-12-07 20-02-08
> class(tmpTimes5)
[1] "timeSeries"
attr(,"package")
[1] "timeSeries"
> as.timeDate(tmpTimes5, format="%d-%m-%y")
Error in as.timeDate(tmpTimes5, format = "%d-%m-%y") : 
  unused argument(s) (format = "%d-%m-%y")
> as.Date(tmpTimes5, format="%d-%m-%y")
Error in as.Date.default(tmpTimes5, format = "%d-%m-%y") : 
  do not know how to convert 'tmpTimes5' to class "Date"
> format.POSIXlt(tmpTimes5, format="%d-%m-%y", usetz=FALSE)
Error in format.POSIXlt(tmpTimes5, format = "%d-%m-%y", usetz = FALSE) : 
  wrong class
> as.POSIXlt(tmpTimes5, format="%d-%m-%y", usetz=FALSE)
Error in as.POSIXlt.default(tmpTimes5, format = "%d-%m-%y", usetz = FALSE) : 
  do not know how to convert 'tmpTimes5' to class "POSIXlt"
> as.POSIXct(tmpTimes5, format="%d-%m-%y", usetz=FALSE)
Error in as.POSIXlt.default(x, tz, ...) : 
  do not know how to convert 'x' to class "POSIXlt"

TimeDateパッケージには「範囲」の機能がありますが、Dateクラスへの変換は個々のインスタンスで機能しますが、何らかの理由でデータフレームでは機能しません。

> as.Date(tmpTimes4[1,1], format="%d-%m-%y")
[1] "2007-03-01"
> as.Date(tmpTimes4, format="%d-%m-%y")
Error in as.Date.default(tmpTimes4, format = "%d-%m-%y") : 
  do not know how to convert 'tmpTimes4' to class "Date"

この時点で、それを行うことはほとんど不可能だと思いますので、どんな考えでも大歓迎です!

よろしく、

25
Jura

いくつかのダミーデータから始めます。

start <- as.Date("2010/01/01")
end <- as.Date("2010/12/31")
set.seed(1)
datewant <- seq(start, end, by = "days")[sample(15)]
tmpTimes <- data.frame(EntryTime = datewant, 
                       ExitTime = datewant + sample(100, 15))
## reorder on EntryTime so in random order
tmpTimes <- tmpTimes[sample(NROW(tmpTimes)), ]
head(tmpTimes)

次のようなものがあります。

> head(tmpTimes)
    EntryTime   ExitTime
8  2010-01-14 2010-03-16
9  2010-01-05 2010-01-17
7  2010-01-10 2010-01-30
3  2010-01-08 2010-04-16
10 2010-01-01 2010-01-26
13 2010-01-12 2010-02-15

上記を使用して、目標1を見て、最も早い日付と最も遅い日付の差を計算します。日付を数値であるかのように扱うことができます(つまり、とにかく内部的に格納される方法です)ので、min()max()などの関数は機能します。 difftime()関数を使用できます:

> with(tmpTimes, difftime(max(EntryTime), min(EntryTime)))
Time difference of 14 days

または標準減算を使用します

> with(tmpTimes, max(EntryTime) - min(EntryTime))
Time difference of 14 days

日数の差を取得します。 head()tail()は、実際の最高値と最低値ではなく、ベクトルの最初と最後の値を取るため、日付をソートする場合にのみ機能します。

目標2:データフレームを日付に変換しようとしているようです。これはできません。できることは、データフレームのcomponentsのデータを再フォーマットすることです。ここでは、tmpTimes列を日付のいくつかの異なる要約に再フォーマットして、EntryTimeに列を追加します。

tmpTimes2 <- within(tmpTimes, weekOfYear <- format(EntryTime, format = "%W-%Y"))
tmpTimes2 <- within(tmpTimes2, monthYear <- format(EntryTime, format = "%B-%Y"))
tmpTimes2 <- within(tmpTimes2, Year <- format(EntryTime, format = "%Y"))

与える:

> head(tmpTimes2)
    EntryTime   ExitTime weekOfYear    monthYear Year
8  2010-01-14 2010-03-16    02-2010 January-2010 2010
9  2010-01-05 2010-01-17    01-2010 January-2010 2010
7  2010-01-10 2010-01-30    01-2010 January-2010 2010
3  2010-01-08 2010-04-16    01-2010 January-2010 2010
10 2010-01-01 2010-01-26    00-2010 January-2010 2010
13 2010-01-12 2010-02-15    02-2010 January-2010 2010

あなたがアメリカ人であるか、週の始まりに米国の慣習を使用したい場合(%Wは月曜日に週を開始し、米国の慣例では日曜日に開始します)、%W%Uに変更します。 ?strftimeには、%Wおよび%Uが表す内容の詳細があります。


データ形式の最後のポイント:上記では、標準のR形式で日付を処理しました。データを非標準マークアップのデータフレームに、おそらく文字またはファクターとして保存します。次のようなものがあります:

tmpTimes3 <- within(tmpTimes, 
                    EntryTime <- format(EntryTime, format = "%d-%m-%y"))
tmpTimes3 <- within(tmpTimes3, 
                    ExitTime <- format(ExitTime, format = "%d-%m-%y"))

> head(tmpTimes3)
   EntryTime ExitTime
8   14-01-10 16-03-10
9   05-01-10 17-01-10
7   10-01-10 30-01-10
3   08-01-10 16-04-10
10  01-01-10 26-01-10
13  12-01-10 15-02-10

これらの文字または要素を、Rが日付として理解するものに変換する必要があります。私の好みは"Date"クラスです。上記の回答をデータで試す前に、データを正しい形式に変換します。

tmpTimes3 <- 
    within(tmpTimes3, {
           EntryTime <- as.Date(as.character(EntryTime), format = "%d-%m-%y")
           ExitTime <- as.Date(as.character(ExitTime), format = "%d-%m-%y")
           })

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

> head(tmpTimes3)
    EntryTime   ExitTime
8  2010-01-14 2010-03-16
9  2010-01-05 2010-01-17
7  2010-01-10 2010-01-30
3  2010-01-08 2010-04-16
10 2010-01-01 2010-01-26
13 2010-01-12 2010-02-15
> str(tmpTimes3)
'data.frame':   15 obs. of  2 variables:
 $ EntryTime:Class 'Date'  num [1:15] 14623 14614 14619 14617 14610 ...
 $ ExitTime :Class 'Date'  num [1:15] 14684 14626 14639 14715 14635 ...
35
Gavin Simpson

短い答え:

  • まだ行われていない場合は、日付に変換します。
  • 次に、日付のリストでminとmaxを使用します。

    date_list = structure(c(15401, 15405, 15405), class = "Date")
    date_list
    #[1] "2012-03-02" "2012-03-06" "2012-03-06"
    
    min(date_list)
    #[1] "2012-03-02"
    max(date_list)
    #[1] "2012-03-06"
    
9
tucson