将chr“00:00:00”转换为日期时间“00:00:00”

时间:2014-09-21 22:24:38

标签: r time posixct lubridate posixlt

我的问题来自this question。问题有以下字符串。

x <- "2007-02-01 00:00:00"
y <- "02/01/2007 00:06:10"

如果您尝试将此字符串转换为日期类对象,则会发生一些有趣的事情。

这是来自@ nrusell答案的样本。

as.POSIXct(x,tz=Sys.timezone())
[1] "2007-02-01 EST"

as.POSIXct(y,format="%m/%d/%Y %H:%M:%S",tz=Sys.timezone())
[1] "2007-02-01 00:06:10 EST" 

如您所见,00:00:00从第一个示例中消失。 @Richard Scriven在我们的讨论中使用lubridate留下了以下示例。

dt <- as.POSIXct("2007-02-01 00:00:00")
hour(dt) <- hour(dt)+1
dt
[1] "2007-02-01 01:00:00 EST"
hour(dt) <- hour(dt)-1
dt
[1] "2007-02-01 EST"

再一次,00:00:00消失了。为什么R避免在转换后将00:00:00保留在日期类对象中?我们如何保留00:00:00

1 个答案:

答案 0 :(得分:5)

如果日期的时间部分是午夜,那么只有print才能删除精度。这是在??strftime帮助中解释的litlay,特别是格式参数:

  

字符串。默认值为“%Y-%m-%d%H:%M:%S”(如果有)   组件的时间分量不是午夜,“%Y-%m-%d”   否则

一个想法是为POSIXct对象重新定义S3方法print

print.POSIXct <- function(x,...)print(format(x,"%Y-%m-%d %H:%M:%S"))

现在举例来说,如果你打印x日期(午夜部分),你会得到:

x <- "2007-02-01 00:00:00"
x <- as.POSIXct(x,tz=Sys.timezone())
x
[1] "2007-02-01 00:00:00"