29

我有一个格式为“Ymd H:M:S”的“日期时间列“开始”。我想将此列拆分为“日期”和“时间”列。

我尝试了以下方法:

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

但是,如果我使用该功能,这可行str(df)

# 'data.frame':   18363 obs. of  19 variables:<br>
#  $ Start    : Factor w/ 67 levels "2013-09-01 08:07:41.000",..: 1 1 1 1 1 1 1 1 1 1 ...
# [snip]

所以现在我只需要知道如何将时间和日期转换factor为“时间”和“日期”。

4

7 回答 7

32

怎么样

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

df$Time <- format(df$Start,"%H:%M:%S")
于 2013-10-10T10:01:53.397 回答
24
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") 

用于as.Date将 'Start' 转换为 class 的变量Date。对于时间变量,我们首先将 'Start' 转换为POSIXct. 然后用于format将时间分量提取为字符串。

于 2013-10-18T09:31:17.257 回答
6

通过查看您的列格式,我想说您可以使用 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")
于 2017-11-15T07:44:46.960 回答
6

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.

于 2019-09-17T02:21:55.270 回答
3

您可能更喜欢做这样的事情,避免使用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
于 2013-10-10T10:49:57.050 回答
1

如果您对非base替代品持开放态度,您可以使用data.table::IDateTimewhich

接受日期时间输入并返回包含日期和时间列的数据表

...分别属于IDate* 和ITime** 类:

x = as.POSIXct("2013-09-01 08:07:41") + 0:2
IDateTime(x)
#         idate    itime
# 1: 2013-09-01 08:07:41
# 2: 2013-09-01 08:07:42
# 3: 2013-09-01 08:07:43

*IDate是派生自 的日期类Date。它与类具有相同的内部表示Date,除了存储模式是整数。

**ITime是一个时间类,存储为一天中的整数秒数。

于 2021-03-04T22:16:53.457 回答
0

您可以在此方法中使用它。它工作得很好

format(mdy(df_5star$Date4)

希望能帮助到你!

于 2019-12-02T03:18:25.123 回答