2016-09-30 2 views
0

나는 엑셀에서 일부 숫자 날짜 데이터를 가지고 :R의 숫자 (십진) 날짜 다루기?

모두 ClosetimeOpentime
> df <- data.frame(c(42613, 42612, 42614), c(42614.61, 42613.97, 42612.12)) 
> names(df) <- c("Closetime", "Opentime") 

numeric이다. 나는에 lubridate::date_decimal를 사용하려고하면 충분히

> df$Closetime <- paste(as.Date(df$Closetime, origin = '1900-01-01'), c('00:00:00')) 

쉬운 Closetime을 할 수 있지만 : Closetime의 모든 일에 '00 : 00 : 나는 OpenTime에서시/분/초 데이터를 보존하고 시간 '00를 추가 할 Opentime, 모든 것이 지옥에갑니다.

> df$Opentime <- date_decimal(df$Opentime) 
> df 
      Closetime    Opentime 
1 2016-09-02 00:00:00 42614-08-11 15:36:00 
2 2016-09-01 00:00:00 42613-12-21 01:12:00 
3 2016-09-03 00:00:00 42612-02-13 22:04:48 
내가 모두 OpentimeClosetime 동일한 유형/형식의로 얻을 수있는 방법

? 나는 결국 각 칼럼의 시간 사이의 차이를 시간 단위로 얻을 수 있기를 기대하고 있습니다.

답변

2

당신이 POSIXct를 사용할 수있는 경우, 예를 들어

df$Opentime <- as.POSIXct(df$Opentime*24*60*60, 
       origin="1900-01-01", 
       tz="UTC") 

추론을 수행 할 수 있습니다 POSIXct 우리가 엑셀 날짜에 대한 help("as.Date")의 조언을 따라 원산지

+2

글쎄, 그건 너의 * 느슨한 * 조정 커플 몇 초로 스케일링 일 초 단위로 가능한 최악의 접근법입니다. 다른 답변은 R의 유형을 사용하여이를 올바르게 수행하는 방법을 보여줍니다. –

+0

@DirkEddelbuettel 공정한 점이지만, 모든 중간 변환을 수행하는 경우 아마도 그 용도가 무엇인지 지적해야합니다. –

+0

다시 오시겠습니까? 아래 내 대답을 언급하고 있습니까? 읽을 수 있니? –

2

첫 번째 이후의 초 단지 숫자입니다.

df$Closetime_p <- as.Date(df$Closetime, origin = "1899-12-30") 
df$Opentime_p <- as.Date(floor(df$Opentime), origin = "1899-12-30") 

그런 다음 우리가 POSIXct로 변환 : 당신이 다음 POSIXct로 변환 않는

df$Opentime_p <- df$Opentime_p + (df$Opentime - floor(df$Opentime)) * 24 * 3600 
# Closetime Opentime Closetime_p   Opentime_p 
#1  42613 42614.61 2016-08-31 2016-09-01 14:38:24 
#2  42612 42613.97 2016-08-30 2016-08-31 23:16:48 
#3  42614 42612.12 2016-09-01 2016-08-30 02:52:48 
1

날짜로 변환 :

df$Closetime_p <- as.POSIXct(as.POSIXlt(df$Closetime_p, tz = "GMT"), tz = "GMT") 
df$Opentime_p <- as.POSIXct(as.POSIXlt(df$Opentime_p, tz = "GMT"), tz = "GMT") 

지금 우리가 시간을 추가 여기 윈도우 엑셀 가정 :

먼저 data.frame을 만듭니다 (열 이름을 설정하는 방법에 유의하십시오) :

R> df <- data.frame(CloseT=c(42613, 42612, 42614), OpenT=c(42614.61, 42613.97, 42612.12)) 
R> df 
    CloseT OpenT 
1 42613 42614.6 
2 42612 42614.0 
3 42614 42612.1 
R> 

그런 다음 날짜로 변환 :

R> df$CloseT <- as.Date(df$CloseT, origin="1900-01-01") 
R> df$OpenT <- as.Date(df$OpenT, origin="1900-01-01") 
R> df 
     CloseT  OpenT 
1 2016-09-02 2016-09-03 
2 2016-09-01 2016-09-02 
3 2016-09-03 2016-09-01 
R> 

마지막으로, POSIXct로 변환 :

R> df$OpenT <- as.POSIXct(df$OpenT) 
R> df$CloseT <- as.POSIXct(df$CloseT) 
R> df 
       CloseT    OpenT 
1 2016-09-01 19:00:00 2016-09-03 09:38:24 
2 2016-08-31 19:00:00 2016-09-02 18:16:48 
3 2016-09-02 19:00:00 2016-08-31 21:52:48 
R> 

POSIXlt를 통해가는 것은 당신이 시간대를 설정할 수 있습니다, 롤랜드가 켰을 때.

1

확인 date_decimal에 대한 설명서 :

POSIXct 객체, 그 해는 소수의 정수 부분에 해당한다. 귀하의 예제에서 그래서

date <- ymd("2009-02-10") 
decimal <- decimal_date(date) # 2009.11 
date_decimal(decimal) # "2009-02-10 UTC" 

, 그것은 올해로 42614을 해석합니다.

as.POSIXct을 사용해보세요. 시간대를 지정해야 할 수도 있지만 필요한 경우 델타가 필요하지 않습니다.나는 시간 차이를 계산 한 아래 : 디스플레이가 올바른 시간이 있는지 확인하려는 경우

df <- data.frame(c(42613, 42612, 42614), c(42614.61, 42613.97, 42612.12)) 
names(df) <- c("Closetime", "Opentime") 
df$Closetime <- as.POSIXct(as.Date(df$Closetime, origin = '1900-01-01')) 
df$Opentime <- as.POSIXct(as.Date(df$Opentime, origin = '1900-01-01')) 
df$delta <- df$Opentime - df$Closetime 
df 
      Closetime   Opentime  delta 
1 2016-09-01 20:00:00 2016-09-03 10:38:24 1.61 days 
2 2016-08-31 20:00:00 2016-09-02 19:16:48 1.97 days 
3 2016-09-02 20:00:00 2016-08-31 22:52:48 -1.88 days 

주석에 기반을 올바르게 시간대와 일치해야합니다. tzone 속성을 설정하여 as.POSIXct으로 변환 한 후에이 작업을 수행 할 수 있습니다.

df <- data.frame(c(42613, 42612, 42614), c(42614.61, 42613.97, 42612.12)) 
names(df) <- c("Closetime", "Opentime") 
df$Closetime <- as.POSIXct(as.Date(df$Closetime, origin = '1900-01-01')) 
df$Opentime <- as.POSIXct(as.Date(df$Opentime, origin = '1900-01-01')) 
attr(df$Closetime, "tzone") <- "GMT" 
attr(df$Opentime, "tzone") <- "GMT" 
df$delta <- df$Opentime - df$Closetime 
df 

    Closetime   Opentime  delta 
1 2016-09-02 2016-09-03 14:38:24 1.61 days 
2 2016-09-01 2016-09-02 23:16:48 1.97 days 
3 2016-09-03 2016-09-01 02:52:48 -1.88 days 
+0

'Closetime'에 모든 값에 대해 '00 : 00 : 00'시간이 필요하다면 어떻게해야합니까? 지정해야 할 매개 변수가 있습니까? – blacksite

+0

신경 쓰지 마라. 나는'lubridate :: hour'를 사용하고'hour (df $ Closetime) <- 0'으로 설정할 수 있었다. – blacksite

+2

목표가 둘 사이의 차이를 계산하는 것이라면 계산이 취소 될 수 있습니다. 'Closetime'이 1 시간도 남지 않도록 GMT 시간대로 강제하는 방법을 보여주기 위해 편집 할 것입니다. –

관련 문제