2010-12-08 3 views
18

내 데이터 프레임의 두 열을 '좋은'날짜 & 시간 클래스로 변환하려고 시도하고 있으며 지금까지별로 성공하지 못했습니다. 그것으로. 나는 다양한 클래스 (timeDate, Date, timeSeries, POSIXct, POSIXlt)를 시도했지만 성공하지는 못했다. 아마도 나는 명백한 부분을 간과 할뿐입니다. 많은 접근 방식을 시도했기 때문에 무엇이 더 이상 무엇인지 모릅니다. 여러분 중 일부는 내가 잘못한 부분에 대해 밝힐 수 있기를 바랍니다.최고 (최신) 날짜와 최저 (가장 빠른) 날짜를 찾는 방법

목표 : 두 날짜 간의 차이를 가장 빠른 날짜와 가장 최근 날짜를 사용하여 계산하고 싶습니다. head() 및 tail()을 사용하여이 작업을 수행 할 수 있지만 이러한 값은 데이터의 가장 빠른 최신 날짜가 아니기 때문에 다른 방법이 필요합니다. (날짜별로 데이터를 정렬하기 때문에 데이터 정렬 작업을 수행 할 수 없습니다.)

두 번째 목표 : 날짜를 일일 형식 (예 : 8-12 -2010), 주중, 월간, 연간 수준 (예 : '49 -2010 ', '12 년 -10'및 '2010')으로 변경되었습니다. 형식 설정 (예 : "% d- % m- % y")으로이 작업을 수행 할 수 있습니다. data.frame을 타임 클래스로 변환하고 올바른 형식 (8-12-2010 -> format ("% B- % y") -> 'december-10')으로 타임 클래스를 변환하면됩니다. 그 시간대를 매월 수준이있는 요인으로 변형시키는 것인가?

두 가지 목표를 위해 어떤 방식 으로든 날짜 프레임을 시간 클래스로 변환해야하는데, 이것은 내가 어떤 어려움에 처한 곳입니다.

내 dataframe은 다음과 같습니다 다음으로 변환하지만,

> 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 패키지 '범위'에 대한 기능을 가지고 : 여기

> 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 

내가 무엇을 시도했다의 요약이다 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()과 같은 기능이 작동합니다. 당신은 difftime() 기능을 사용할 수 있습니다

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

또는 일의 차이를 얻기 위해 표준 공제

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

를 사용합니다. 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" 
    
관련 문제