我正在使用数据集whcih有这样的日期和时间变量:Date Time 2006-12-16 17:24:00 ...对于数千行。 我想要的是创建日期和时间的POSIXct格式时间。 这是我的代码:
data_full <-read.csv("C:/R/household_power_consumption/household_power_consumption.txt",
header= T,sep = ';',na.strings = "?",
stringsAsFactors=FALSE)
data_full$Date <- as.Date(data_full$Date, format="%d/%m/%Y")
datetime <- paste(as.Date(data_full$Date), data_full$Time)
##head(datetime)
data_full$Datetime <- as.POSIXct(datetime)
##head(data_full$Datetime)
但是,Datetime变量只包含日期,而不是时间。
head(data_full$Datetime)
[1] "2006-12-16 EST" "2006-12-16 EST" "2006-12-16 EST" "2006-12-16 EST"
"2006-12-16 EST" "2006-12-16 EST"
但是datetime变量包含日期和时间,所以我认为它可能是as.POSIXct的麻烦。
head(datetime)
[1] "2006-12-16 17:24:00" "2006-12-16 17:25:00" "2006-12-16 17:26:00" "2006-12-16 17:27:00" "2006-12-16 17:28:00"
[6] "2006-12-16 17:29:00"
那么有人知道发生了什么吗?我感到很困惑.... 谢谢你的帮助!
答案 0 :(得分:2)
您可以尝试as.POSIX
并指定格式
as.POSIXlt(datetime, format=...)
或
as.POSIXct(datetime, format=...)
可重复的例子
data <- data.frame(Date=as.Date("2017-01-01"), Time="01:01:01")
datetime <- paste(as.Date(data$Date), data$Time)
as.POSIXct(datetime, format="%Y-%m-%d %H:%M:%S")
# [1] "2017-01-01 01:01:00 CST"
data$Datetime <- as.POSIXct(datetime, format="%Y-%m-%d %H:%M:%S")
data
# Date Time Datetime
# 1 2017-01-01 01:01:01 2017-01-01 01:01:01
正如评论中所指出的,如果你有不同格式的日期时间,as.POSIX如果指定格式将返回NA
data <- data.frame(Date=as.Date(c("2017-01-01","2017-01-02")), Time=c("01:01:01", "01:01"))
# Date Time
# 1 2017-01-01 01:01:01
# 2 2017-01-02 01:01
datetime <- paste(as.Date(data$Date), data$Time)
data$Datetime <- as.POSIXct(datetime, format="%Y-%m-%d %H:%M:%S")
data
# Date Time Datetime
# 1 2017-01-01 01:01:01 2017-01-01 01:01:01
# 2 2017-01-02 01:01 <NA>
<强>解决方案强>
您可以使用lubridate::ymd_hms
和参数truncated
library(lubridate)
data$Datetime <- ymd_hms(datetime, truncated=2)
data
# Date Time Datetime
# 1 2017-01-01 01:01:01 2017-01-01 01:01:01
# 2 2017-01-02 01:01 2017-01-02 01:01:00
答案 1 :(得分:1)
要正确返回时间值,所有值都必须包含时间(除非您使用format
,如下所示)。在您的示例中,必须是您的一个或多个值不包含时间。这是一个简单的例子:
## with time - works as intended
as.POSIXct("2006-01-01 01:12:36")
# [1] "2006-01-01 01:12:36 PST"
## one value with time, one without - drops time element
as.POSIXct(c("2006-01-01 01:12:36", "2006-01-01"))
# [1] "2006-01-01 PST" "2006-01-01 PST"
注意从第二个结果中删除的时间,即使我使用了as.POSIXct()
。确保Time
列中的所有值都包含有意义的时间。
你也可以在format
参数中使用一个字符向量,但对于长向量来说这可能很乏味。请注意,此处的第二个元素添加了一个时间:
as.POSIXct(
c("2006-01-01 01:12:36", "2006-01-01"),
format = c("%Y-%m-%d %T", "%Y-%m-%d")
)
# [1] "2006-01-01 01:12:36 PST" "2006-01-01 00:00:00 PST"
我会确保您Time
之前的paste()
列中有有效时间。