我有一个名为“开始”的列日期时间(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的菜鸟,所以请不要把我烧到地上..
万分感谢!
答案 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
是一个时间类,存储为一天中的整数秒数。