分割日期时间

时间:2013-10-10 09:47:48

标签: r datetime split

我有一个名为“开始”的列日期时间(DD:MM:yyyy HH:mm:ss)的df,我想将此列拆分为两个名为“date”和“time”的列。
现在我尝试了以下内容:

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个变量:
    $开始:因子w / 67级别“2013-09-01 08:07:41.000”,..:1 1 1 1 1 1 1 1 1 1 ...
   $ Interval:int 47259 47259 47259 47259 47259 47259 47259 47259 47259 47259 ...
   $ DateTime:因子w / 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的菜鸟,所以请不要把我烧到地上..

万分感谢!

7 个答案:

答案 0 :(得分:22)

怎么样

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

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

答案 1 :(得分:13)

抱歉这个迟到的答案!无论如何,我从大学的某个人那里得到了帮助,他想出了以下非常简单的调整我的时间代码......:

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”,就像我想要的那样。

感谢大家的帮助!我希望将来可以得到一些帮助,虽然我怀疑它是否适合编程..!

答案 2 :(得分:4)

通过查看列格式,我会说您可以使用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")

答案 3 :(得分:2)

你可能更愿意做这样的事情,避免使用一个并非真正必要的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

答案 4 :(得分:0)

假设您的数据看起来与此类似,其中有一个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

答案 5 :(得分:0)

您可以在此方法中使用它。效果很好

format(mdy(df_5star$Date4)

希望有帮助!

答案 6 :(得分:0)

如果您对非 base 替代方案持开放态度,您可以使用 data.table::IDateTime which

<块引用>

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

...分别属于 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 是一个时间类,存储为一天中的整数秒数。