2016-07-06 16 views
0
から

に変換します。12時間から24時間に変換しようとすると正しい変換が得られません。私のスクリプト(サンプルデータは下にあります)。 24時間形式に変換することなくSフォーマット:M:私はTODと呼ばれる新しい変数を作成しようとすると、12時間から24時間形式をR

library(lubridate) 
library(data.table) 

# Read Sample Data 
df <- data.frame(c("April 22 2016 10:49:15 AM","April 22 2016 10:01:21 AM","April 22 2016 09:06:40 AM","April 21 2016 09:50:49 PM","April 21 2016 06:07:18 PM")) 
colnames(df) <- c("Date") # Set Column name 
dt <- setDT(df) # Convert to data.table 

ff <- function(x) as.POSIXlt(strptime(x,"%B %d %Y %H:%M:%S %p")) 
dt[,dates := as.Date(ff(Date))] 

は、私がHで出力を取得します。 私が言っているのは、3列目の場合、21時50分49秒になるのではなく、9時50分49秒になるということです。私はこれを行うために2つの異なる方法を試しました。 1つは、data.tableから.ITimeとして使用し、次にstrptimeも使用します。 TODを計算するために使用するコードは次のとおりです。

dt[,TOD1 := as.ITime(ff(Date))] 
dt$TOD2 <- format(strptime(dt$Date, "%B %d %Y %H:%M:%S %p"), format="%I:%M:%S") 

私はdata.tableでのstrptimeを使用してすべての問題を解消する代わりにdata.tableのデータフレームを使用して、それをしようと考えると、まだ同じ答えを得ました。

df$TOD <- format(strptime(df$Date, "%B %d %Y %H:%M:%S %p"), format="%I:%M:%S") # Using dataframe instead of data.table 

正しい回答を得るための洞察はありますか?ここで

+1

最初の翻訳はオフです。 format = "%H:%M:%S"これを代わりに使う: 'dt $ TOD2 < - format(strptime(dt $ Date、"%B%d%Y%I:%M:%S%p " ) '。私は%Iと%Hを切り替えました。 – lmo

+0

私はあなたのコンバージョンを試みましたが、最初はうまくいきませんでした。その後、data.tableが問題を引き起こす前にlubridateを呼び出すことを実現しました。私はdata.tableだけでそれを走らせたとき、予想どおりに走り、正しい答えをくれました。ありがとう。 – Krishnan

答えて

2

としては@lmo、あなたが?strptimeから、代わりに%H%Iパラメータを使用する必要が次のようにコメントし

% H
時間進数(00-23)として。特別な例外として、 (24:00:00など)がISO 8601で許可されているため、入力に使用できます。

%I
10進数での時(01-12)。

strptime("April 21 2016 09:50:49 PM", "%B %d %Y %I:%M:%S %p") 
# [1] "2016-04-21 21:50:49 EDT" 
+1

私はあなたのコンバージョンを試みましたが、最初はうまくいきませんでした。その後、data.tableが問題を引き起こす前にlubridateを呼び出すことを実現しました。私はdata.tableだけでそれを走らせたとき、予想どおりに走り、正しい答えをくれました。ありがとう。 – Krishnan

1

あなたが行く:mdy_hmsは非常に便利であり、あなたのために12月24日時間の時間の世話をしながら、それが自動的にタイムゾーンとしてUTCを割り当てます

library(lubridate) 
df$Date <- mdy_hms(df$Date) 

注こと。必要に応じて別のものを指定することができます。その後、dfをdata.tableに変換することができます。

関連する問題