如何在R中使用strptime()保持午夜(00:00h)?

时间:2016-05-07 14:05:47

标签: r date datetime format posixct

我有一个数据帧df,它具有以下格式的日期因子变量:

2015-12-15 10:00:00
2015-12-19 12:00:00
2015-12-20 20:00:00

这是每小时的数据。在午夜00:00:00观看时会出现问题,因为它不会出现在小时。它只是说:

21/12/2015

正如你所看到的那样,它只说了一天,但却没有时间。 所以我使用strptime转换为日期格式:

df$date <- strptime(df$date,"%d/%m/%Y %H:%M")

除了午夜00:00:00的任何一天,这一切都适用于所有的时间和日期,返回:

NA

我非常感谢一些帮助,因为我一直在查看StackOverflow和其他论坛以前的帖子,但我没有&#39;设法找出这个特定问题的解决方案。

2 个答案:

答案 0 :(得分:4)

来自R的strptime文档(重点补充):

  

格式

     

字符串。格式方法的默认值为“%Y-%m-%d%H:%M:%S”如果任何元素的时间分量不是午夜,则为“%Y-%m-%d” “否则。如果设置了选项(“digits.secs”),则打印指定的位数将持续数秒。

所以信息仍然存在,您只需要format将其与时间组件一起打印出来。

> midnight <- strptime("2015-12-19 00:00:00","%Y-%m-%d %H:%M")
> midnight
[1] "2015-12-19 EST"
> format(midnight,"%Y/%m/%d %H:%M")
[1] "2015/12/19 00:00"

答案 1 :(得分:1)

如果我们有vector之类的“v1”,则使用strptime我们会为那些格式不正确的元素获取NA

strptime(v1,  "%d/%m/%Y %H:%M:%S", tz = "UTC")
#[1] "2015-12-19 12:00:00 UTC" NA  

解决此问题的一种方法是将paste“00:00:00”字符串替换为那些没有

的字符串。
v1[!grepl(":", v1)] <- paste(v1[!grepl(":", v1)], "00:00:00") 
strptime(v1,  "%d/%m/%Y %H:%M:%S", tz = "UTC")
#[1] "2015-12-19 12:00:00 UTC" "2015-12-19 00:00:00 UTC"

如果我们使用lubridateparse_date_time可以使用多种格式

library(lubridate)
parse_date_time(v1, guess_formats(v1, c("%d/%m/%Y %H:%M:%S", "%d/%m/%Y")))
#[1] "2015-12-19 12:00:00 UTC" "2015-12-19 00:00:00 UTC"

数据

v1 <- c("19/12/2015 12:00:00", "19/12/2015")