擦除分裂中的空间 - R.

时间:2018-05-15 20:14:21

标签: r datetime time split

我有一个数据框,我按日期和时间(两列)拆分日期时间列。但是,当我按时间分组时,它会给我重复的时间。所以,为了分析它我在时间列上使用了table(),它也给了我重复。这是它的一个例子:

> table(df$time)
 00:00:00 00:00:00   00:15:00 00:15:00   00:30:00 00:30:00
     2211      1047      2211      1047      2211      1047

正如您所看到的,当我分开时,其中一个“唯一”值保留了" "。有没有简单的方法来解决这个问题?

PS:时间列的数据类型是字符。

编辑:已添加代码

df$datetime <- as.character.Date(df$datetime)
x <- colsplit(df$datetime, ' ', names =  c('Date','Time'))
df <- cbind(df, x)

2 个答案:

答案 0 :(得分:0)

有很多方法。其中之一是使用适当的函数从Datetime列中提取日期和时间:

df <- data.frame(datetime = seq(
  from=as.POSIXct("2018-5-15 0:00", tz="UTC"),
  to=as.POSIXct("2018-5-16 24:00", tz="UTC"),
  by="30 min") )

head(df$datetime)
#[1] "2018-05-15 00:00:00 UTC" "2018-05-15 00:30:00 UTC" "2018-05-15 01:00:00 UTC" "2018-05-15 01:30:00 UTC"
#[5] "2018-05-15 02:00:00 UTC" "2018-05-15 02:30:00 UTC"

df$Date <- as.Date(df$datetime)
df$Time <- format(df$datetime,"%H:%M:%S")

    head(df)
#     datetime       Date     Time
# 1 2018-05-15 00:00:00 2018-05-15 00:00:00
# 2 2018-05-15 00:30:00 2018-05-15 00:30:00
# 3 2018-05-15 01:00:00 2018-05-15 01:00:00
# 4 2018-05-15 01:30:00 2018-05-15 01:30:00
# 5 2018-05-15 02:00:00 2018-05-15 02:00:00
# 6 2018-05-15 02:30:00 2018-05-15 02:30:00


table(df$Time)
#00:00:00 00:30:00 01:00:00 01:30:00 02:00:00 02:30:00 03:00:00 03:30:00 04:00:00 04:30:00 05:00:00 05:30:00 
#3        2        2        2        2        2        2        2        2        2        2        2 
#06:00:00 06:30:00 07:00:00 07:30:00 08:00:00 08:30:00 09:00:00 09:30:00 10:00:00 10:30:00 11:00:00 11:30:00 
#2        2        2        2        2        2        2        2        2        2        2        2 
#12:00:00 12:30:00 13:00:00 13:30:00 14:00:00 14:30:00 15:00:00 15:30:00 16:00:00 16:30:00 17:00:00 17:30:00 
#2        2        2        2        2        2        2        2        2        2        2        2 
#18:00:00 18:30:00 19:00:00 19:30:00 20:00:00 20:30:00 21:00:00 21:30:00 22:00:00 22:30:00 23:00:00 23:30:00 
#2        2        2        2        2        2        2        2        2        2        2        2 




#If the data were given as character strings and contain extra spaces the above approach will still work
df <- data.frame(datetime=c("2018-05-15 00:00:00","2018-05-15   00:30:00",
                            "2018-05-15  01:00:00", "2018-05-15      02:00:00",
                            "2018-05-15 00:00:00","2018-05-15   00:30:00"), 
                 stringsAsFactors=FALSE)

df$Date <- as.Date(df$datetime)
df$Time <- format(as.POSIXct(df$datetime, tz="UTC"),"%H:%M:%S")
head(df)
#                   datetime       Date     Time
# 1      2018-05-15 00:00:00 2018-05-15 00:00:00
# 2    2018-05-15   00:30:00 2018-05-15 00:30:00
# 3     2018-05-15  01:00:00 2018-05-15 01:00:00
# 4 2018-05-15      02:00:00 2018-05-15 02:00:00
# 5      2018-05-15 00:00:00 2018-05-15 00:00:00
# 6    2018-05-15   00:30:00 2018-05-15 00:30:00

table(df$Time)
#00:00:00 00:30:00 01:00:00 02:00:00 
#       2        2        1        1 

答案 1 :(得分:0)

reshape2::colsplit接受正则表达式,因此您可以拆分&#39; \ s +&#39;匹配1个或多个空白字符。

您可以使用?base::regex在R中找到有关正则表达式的更多信息。语言之间的语法通常是不变的,因此您几乎可以使用任何正则表达式教程。看看https://regex101.com/。该站点实时评估您的正则表达式,并准确显示每个部分匹配的内容。这非常有帮助!

请注意,在R中,与大多数其他语言相比,您必须加倍反斜杠的数量 \。因此\s(匹配1个空格字符)必须在R中写为\\s