2016-09-30 3 views
0

私はExcelから、いくつかの数値型の日付データを持っている:Rの数字(小数)の日付を扱う?

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

両方ClosetimeOpentimenumericです。

Closetimeを行うのに十分簡単
> df$Closetime <- paste(as.Date(df$Closetime, origin = '1900-01-01'), c('00:00:00')) 

が、私は上のlubridate::date_decimalを使用しようとすると:00:00' Closetime内のすべての日に私は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は原点からの秒数だけある

+2

まあ、それは例えば、調整秒のカップル*あなた*緩ん秒にスケーリング日の最悪の可能なアプローチです。他の答えは、Rの型を使ってこれを正しく行う方法を示しています。 –

+0

@DirkEddelbuettelの公平なポイントですが、おそらく中間のコンバージョンをすべて行う場合は、その目的が何であるかを指摘する必要があります。 –

+0

もう一度やってきますか?私の答えは以下を参照していますか?読めますか? –

2

まず我々は、Excelの日付についてhelp("as.Date")にアドバイスに従ってください。私はここでWindowsのエクセル前提としています

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

その後、我々はPOSIXctに変換:

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") 

今、私たちは時間を追加します。あなたがそうであるように

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

POSIXctに変換、その後、日付に変換します:

まず、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に変換:ローランドがあったとしてPOSIXltを経由して行く

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> 

あなたは、タイムゾーンを設定することができます。

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

あなたの目標が2つの間の差を計算することであれば、これはあなたの計算を捨てるかもしれません。 'Closetime'が1時間もなく残るようにGMTのタイムゾーンに強制する方法を示すために編集します。 –