2012-01-06 3 views
6

interval으로 표시된 시간 길이를 lubridate으로 지정하는 가장 좋은 방법은 지정된 단위입니까? -하지만 어쩌면 누군가가 여기 하나 알고윤활유 간격의 길이

> ival 
[1] 2011-01-01 03:00:46 -- 2011-10-21 18:33:44 

> difftime(attr(ival, "start") + as.numeric(ival), attr(ival, "start"), 'days') 
Time difference of 293.6479 days 

(나는 또한 더 좋은 방법을 사용할 수가 있다는 가정하에, https://github.com/hadley/lubridate/issues/105에 기능 요청으로 이것을 추가 : 내가 알아낼 수있는 것은 다음과 같은 지저분한 것 같은 것입니다.)

업데이트 - 분명히 difftime 함수도이 문제를 처리하지 않습니다. 여기에 예제가 있습니다.

> (d1 <- as.POSIXct("2011-03-12 12:00:00", 'America/Chicago')) 
[1] "2011-03-12 12:00:00 CST" 
> (d2 <- d1 + days(1)) # Gives desired result 
[1] "2011-03-13 12:00:00 CDT" 
> (i2 <- d2 - d1) 
[1] 2011-03-12 12:00:00 -- 2011-03-13 12:00:00 
> difftime(attr(i2, "start") + as.numeric(i2), attr(i2, "start"), 'days') 
Time difference of 23 hours 

내가 아래에 언급 된 바와 같이

, 내가 먼저 period에 입력을 캐스팅하지 않는 /.interval 기능을 구현하는 것이 처리하는 하나의 좋은 방법을 생각한다.

+0

특정 단위로 간격을두고 싶지만 아래 주석의 문맥에서 가장 가까운 전체 단위로 반올림하려는 것처럼 들리겠습니까? 그렇다면 편집 할 수 있으므로 명확합니다. –

+0

아니요, 반올림하고 싶지 않습니다. 내가 방금 편집 한 내용이 명확 해지기를 바랍니다. –

답변

10

as.duration 기능은 lubridate가 제공하는 기능입니다. 간격 클래스는 시작부터 초 수로 내부적으로 표현되므로 시간 수를 원하면 as.numeric(ival)을 3600으로 나누거나 일 (3600 * 24)으로 나눌 수 있습니다.

개체에 적용된 작업 예제가 필요하면 dput(ival의 출력을 제공해야합니다. help(duration) 페이지에서 생성 된 객체에 대한 테스트를 수행했습니다.이 페이지는 ?interval이 나를 보내주었습니다.

date <- as.POSIXct("2009-03-08 01:59:59") # DST boundary 
date2 <- as.POSIXct("2000-02-29 12:00:00") 
span <- date2 - date #creates interval 
span 
#[1] 2000-02-29 12:00:00 -- 2009-03-08 01:59:59 
str(span) 
#Classes 'interval', 'numeric' atomic [1:1] 2.85e+08 
# ..- attr(*, "start")= POSIXct[1:1], format: "2000-02-29 12:00:00" 
as.duration(span) 
#[1] 284651999s (9.02y) 
as.numeric(span)/(3600*24) 
#[1] 3294.583 
# A check against the messy method: 
difftime(attr(span, "start") + as.numeric(span), attr(span, "start"), 'days') 
# Time difference of 3294.583 days 
+0

고마워,하지만 그건 틀린거야 - 3600 * 24는 항상 하루의 초 수는 아니다. 내가하려는 것은 DST 등을 이미 처리하고있는 시스템을 활용하는 것입니다. –

+0

@KenWilliams 왜 이것이 틀렸다고 생각하는지 이해가되지 않습니다. '? duration'은 'difftime'과 마찬가지로 실제로 DST를 존중한다는 의미입니다. 'as.duration'을 사용하여 예제를 변환하면'difftime'을 사용했을 때와 정확히 똑같은 대답을 얻습니다. – joran

+0

당신은 또한 일수로 나누기도 할 수 있습니다. (1) – hadley

3

켄, 일로 나누기 (1)는 원하는 것을 제공합니다. Lubridate는 기간을 기간별로 나누면 기간을 강제 실행하지 않습니다. (비록 인터벌에서 전체 기간의 정확한 수를 찾는 알고리즘은 인터벌을 analagous 기간 수로 나눈 추정으로 시작합니다. 이것은 당신이 알아 차릴 수있는 것일 수도 있습니다).

최종 결과는 해당 기간에 맞는 전체 기간 수입니다. 경고 메시지는 사용자가 추정치임을 사용자에게 알려주므로 응답에서 일부 기간이 삭제 될 수 있습니다. 더 짧은 기간의 배수로 변환하지 않으면 시계 시간을 수정할 수 없으므로 일정 기간 동안 수학을하는 것이 현명하지 않습니다. 그러나 변환을 수행하는 일관된 방법은 없습니다. 예를 들어 언급하는 날은 23 시간과 같지만 다른 날은 24 시간과 같습니다. 올바른 방법으로 생각하고 있습니다. 기간은 DST, 윤년 등으로 인해 발생하는 유사 콘텐츠를 존중하려는 시도이지만 전체 단위로만 수행합니다.

위에서 언급 한 빼기 오류를 재현 할 수 없습니다. 그것은 나를 위해 일하는 것 같다.

three <- force_tz(ymd_hms("2011-03-12 12:00:00"), "") 
    # note: here in TX, "" *is* CST 
    (four <- three + days(1)) 
    > [1] "2011-03-13 12:00:00 CDT" 
    four - days(1) 
    > [1] "2011-03-12 12:00:00 CST" 
+0

그러나 - for 일정한 순간에 뿌리를두고 있기 때문에 전환을하는 방법이 있습니다. 임의의 날에 24 시간이 있는지 알 수 없지만이 특정 * 날에는 24 시간이 있는지 알 수 있습니다. 계산 가능해야합니다. –

+0

@KenWilliams 나는 당신의 요점을 이해합니다. Lubridate는 현재 계산을 수행하지 않지만 어쩌면해야합니다. 내 생각에 그 나머지는 그 간격의 첫날의 1/2이 될 것이지만, 그 간격의 마지막 날의 12/23 일 것입니다. 아마도 마지막 날이 모두 중요합니다. – Garrett