web-dev-qa-db-ja.com

日付と時刻の分割

「開始」という名前の列datetime(DD:MM:yyyy HH:mm:ss)のdfがあり、この列を「date」と「time」という2つの名前に分割したいと思います。
今、私は次のことを試しました:

df$Date <- sapply(strsplit(as.character(df$Start), " "), "[", 1)
df$Time <- sapply(strsplit(as.character(df$Start), " "), "[", 2)

ただし、str(df)関数を使用すると、これは機能します(関心のある変数がほとんど見えるように短くします)。

'data.frame':18363 obs。 19個の変数:
$開始:67レベルの係数「2013-09-01 08:07:41.000」、..:1 1 1 1 1 1 1 1 1 1 1 ...
$間隔:int 47259 47259 47259 47259 47259 47259 47259 47259 47259 47259 ...
$ DateTime:18363レベルのファクター "2013-09-01 08:07:41.350"、..:1 2 3 4 5 6 7 8 9 10 ...
$ TimeSensor:num 158489 158489 158490 158490 158491 ...


だから今は、時間と日付を「ファクター」から「時間」と「日付」に変換する方法を知る必要があるだけです。

誰かが解決策を知っていれば、私は非常に感謝します!私はRに関する初心者なので、火傷しないでください。

どうもありがとう!

21
Jalalala

この遅い回答でごめんなさい!とにかく、私は大学の誰かから助けを受けて、彼は私のタイムコードの次の、非常に簡単な調整を思い付きました。

df$Date <- as.Date(df$Start) #already got this one from the answers above
df$Time <- format(as.POSIXct(df$Start) ,format = "%H:%M:%S") 

これは、ファクターを「日付」と「POSIXct」に変換します。

あなたの助けに感謝します!将来的には何らかの恩恵が得られることを願っていますが、プログラミングに関係するかどうかは疑問です。

13
Jalalala

どう?

df$Date <- as.Date(df$Start)

df$Time <- format(df$Start,"%H:%M:%S")
24

列のフォーマットを見ると、as.POSIXctを使用して列を適切にフォーマットし、format()を使用して目的のデータを抽出できます。

これは、DateTime列を分割するときに使用するコードです。

df$Time <- format(as.POSIXct(df$Start,format="%Y:%m:%d %H:%M:%S"),"%H:%M:%S")

df$Date <- format(as.POSIXct(df$Start,format="%Y:%m:%d %H:%M:%S"),"%Y:%m:%d")
4

本当に必要ではないlapplyループの使用を避けて、このようなことをすることを好むかもしれません(しかし、それは悪いことでもありません!)...

#  If we had this data...
df <- data.frame( Start = c( "13:11:2013 15:39" , "13:11:2013 16:15" , "13:11:2013 17:52" ) )

#  We can directly make two columns from the split strings without
#  using a loop by call 'do.call'..
new <- do.call( rbind , strsplit( as.character( df$Start ) , " " ) )
#     [,1]         [,2]   
#[1,] "13:11:2013" "15:39"
#[2,] "13:11:2013" "16:15"
#[3,] "13:11:2013" "17:52"


#  Cbind them to the original data liek so...
cbind( df , Date = new[,2] , Time = new[,1] )
#             Start  Date       Time
#1 13:11:2013 15:39 15:39 13:11:2013
#2 13:11:2013 16:15 16:15 13:11:2013
#3 13:11:2013 17:52 17:52 13:11:2013
2
Simon O'Hanlon

データが1つのdatetime列と他の多くの列でこれに似ていると仮定します

df <- data.frame(a = 1:5, datetime = as.POSIXct(c('2019-02-01 01:00:00', 
                 '2019-02-01 02:00:00', '2019-02-01 03:00:00', 
                 '2019-02-01 04:00:00', '2019-02-01 05:00:00')))

df
#  a            datetime
#1 1 2019-02-01 01:00:00
#2 2 2019-02-01 02:00:00
#3 3 2019-02-01 03:00:00
#4 4 2019-02-01 04:00:00
#5 5 2019-02-01 05:00:00

空白(またはその他の区切り文字が存在する場合)で列を分割して、tidyr::separate

tidyr::separate(df, datetime, c("date", "time"), sep = " ")
#  a       date     time
#1 1 2019-02-01 01:00:00
#2 2 2019-02-01 02:00:00
#3 3 2019-02-01 03:00:00
#4 4 2019-02-01 04:00:00
#5 5 2019-02-01 05:00:00

元の列(datetime)を保持したい場合は、remove = FALSE

0
Ronak Shah