为什么as.POSIXct(日期和时间)在R中会浪费我的时间?

时间:2017-09-16 18:10:31

标签: r posixct

我正在使用数据集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"

那么有人知道发生了什么吗?我感到很困惑.... 谢谢你的帮助!

2 个答案:

答案 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()列中有有效时间。