2010-12-08 16 views
18

私のデータフレームの2つの列を '良い'日付&タイムクラスに変換しようとしています。それと。私は様々なクラス(timeDate、Date、timeSeries、POSIXct、POSIXlt)を試しましたが、成功しませんでした。たぶん私はただのことを見落としているだけで、私は多くのアプローチを試してきたので、何がもう何を知っているのか分かりません。あなたの何人かが私が間違っているところに光を当ててくれることを願っています。最高(最新)と最低(最も早い)日付を見つける方法

ゴール: 2つの日付の差を最も早い日付と最後の日付を使用して計算したいと思います。私はhead()とtail()を使って作業していますが、これらの値はデータの中で最も早く最新の日付である必要はないので、別の方法が必要です。 (日付の日付にのみデータをソートするため、データの並べ替えを行うことができません。)

第2の目標:日付を毎日の形式-2010)、週末、月次、年次の各レベル(すなわち、「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クラスは個々のインスタンスで動作しますが、何らかの理由でデータフレームでは機能しません:

この時点で私はほとんどそれが不可能だと思うので、どんな考えも高く評価されるでしょう!いくつかのダミーデータと

よろしく、

+0

あなたが使用することができ、 'dput(tmpTimes4)'あなたのコード内の正確なデータセットの使用を提供します。 – Marek

+0

@Marek:応答してくれてありがとう!私はDputについて知らなかったので、チップのおかげで。 :) – Jura25

答えて

30

スタート:目標1、計算違いを見て、

> 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 

上記の使用:

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) 

ので、我々はこのようなものを持っています最も早い日付と最新の日付との間。日付を数字のように扱うことができます(つまり、内部的に格納される方法)ので、min()max()のような関数が機能します。

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

や日中の違いを取得するために

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

標準減算を使用します。あなたはdifftime()機能を使用することができます。 head()およびtail()は、これらの日付がベクトルの最初と最後の値を取るため、日付をソートする場合にのみ機能します。

目標2:データフレームを日付に変換しようとしているようです。あなたはこれをすることはできません。できることは、データフレームのコンポーネントのデータを再フォーマットすることです。ここでは、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形式の日付で働いている上記で。おそらく文字や要素として、非標準マークアップのデータフレームにデータを格納しています。あなたはこれらの文字や要因は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 

:だからあなたのようなものを持っています。私の好みは"Date"クラスです。あなたのデータと上記の答えをしようとする前に、正しい形式にデータを変換します

> 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 ... 
+0

ワウギャビン、ありがとう!あなたは、コード例だけでなく、優れた(そして明確な)テキストでも、本当に私を助けてくれました。もう一度ありがとう、私は今それを完全に取得し、ちょうど日の数を計算し、日付を変換し、時間ごとに蘇生を表示することに成功しました。はい! :) – Jura25

+0

@ Jura25:うれしいことがわかりました。 –

+1

実際には、minとmaxは日付に対して機能しますが、日付列にNAがある場合はna.rm = TRUEを使用してください。 stardate <-min(DateofTest、na.rm = TRUE)。頭に困惑した傷を自分で救いなさい。 –

5

短い答え:

  • 変換

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

    ように、あなたのデータは次のようになりますまだ行われていない場合は、これまでの日付。

  • リストの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"