将年份和月份(“yyyy-mm”格式)转换为date?

我有一个这样的数据集:

Month count 2009-01 12 2009-02 310 2009-03 2379 2009-04 234 2009-05 14 2009-08 1 2009-09 34 2009-10 2386 

我想绘制数据(月份作为x值,并计为y值)。 由于数据中有空白,我想将本月的信息转换为date。 我试过了:

 as.Date("2009-03", "%Y-%m") 

但它没有工作。 怎么了? 看来,date()也需要一天,不能为一天设置一个标准值? 哪个function解决了我的问题?

尝试这个。 (在这里我们使用text=Lines来保持这个例子是自包含的,但实际上我们会用文件名replace它。)

 Lines <- "2009-01 12 2009-02 310 2009-03 2379 2009-04 234 2009-05 14 2009-08 1 2009-09 34 2009-10 2386" library(zoo) z <- read.zoo(text = Lines, FUN = as.yearmon) plot(z) 

这个数据的X轴并不是那么漂亮,但是如果现实中有更多的数据,那么它可能是正确的,或者你可以使用代码作为?plot.zoo的例子部分中显示的花式X轴。

上面创build的动物园系列z有一个"yearmon"时间索引,如下所示:

 > z Jan 2009 Feb 2009 Mar 2009 Apr 2009 May 2009 Aug 2009 Sep 2009 Oct 2009 12 310 2379 234 14 1 34 2386 

"yearmon"也可以单独使用:

 > as.yearmon("2000-03") [1] "Mar 2000" 

注意:

  1. "yearmon"类对象按日历顺序sorting。

  2. 这将在等间隔的情况下绘出每月的点数,这可能是想要的; 然而,如果希望以不同的间隔与每月的天数成比例地绘制点,则将z的索引转换为"Date"类: time(z) <- as.Date(time(z))

由于date对应于一个数字值和一个开始date,你确实需要一天。 如果您确实需要将数据设置为date格式,则可以通过将date粘贴到date来手动将date修改为每个月的第一天:

 month <- "2009-03" as.Date(paste(month,"-01",sep="")) 

如果您需要date格式为date格式,最简洁的解决scheme:

 library(zoo) month <- "2000-03" as.Date(as.yearmon(month)) [1] "2000-03-01" 

as.Date会将每个月的第一天修复为yearmon对象。

使用任何时间包:

 library(anytime) anydate("2009-01") # [1] "2009-01-01" 

事实上,正如上面提到的(以及SO中的其他地方),为了将string转换为date,您需要特定的月份date。 从as.Date()手册页:

如果datestring没有完全指定date,则返回的答案可能是系统特定的。 最常见的行为是假设失去的一年,一个月或一天是当前的一个。 如果它错误地指定了一个date,则可靠的实现会给出一个错误,并且date被报告为NA。 不幸的是,一些常见的实现(如glibc )是不可靠的,并猜测意图的含义。

一个简单的解决scheme是将date"01"粘贴到每个date,并使用strptime()来表示它是该月的第一天。


对于那些在R中处理date和时间的人来说,

在R中,时间使用POSIXctPOSIXlt类和date使用Date类。

date存储为1970年1月1日以来的天数,时间存储为1970年1月1日以来的秒数。

所以,例如:

 d <- as.Date("1971-01-01") unclass(d) # one year after 1970-01-01 # [1] 365 pct <- Sys.time() # in POSIXct unclass(pct) # number of seconds since 1970-01-01 # [1] 1450276559 plt <- as.POSIXlt(pct) up <- unclass(plt) # up is now a list containing the components of time names(up) # [1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" "isdst" "zone" # [11] "gmtoff" up$hour # [1] 9 

按date和时间执行操作:

 plt - as.POSIXlt(d) # Time difference of 16420.61 days 

要处理date,可以使用strptime() (从手册页中借用这些示例):

 strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS") # [1] "2006-02-20 11:16:16 EST" # And in vectorized form: dates <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960") strptime(dates, "%d%b%Y") # [1] "1960-01-01 EST" "1960-01-02 EST" "1960-03-31 EST" "1960-07-30 EDT" 

你也可以通过来自parse_date_time fast_strptimeparse_date_time或者fast_strptime函数来实现:

 > parse_date_time(dates1, "ym") [1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC" > fast_strptime(dates1, "%Y-%m") [1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC" 

这两者之间的区别在于parse_date_time允许使用lubridate风格的格式规范,而fast_strptime需要与fast_strptime相同的格式规范。

要指定时区,可以使用tz -parameter:

 > parse_date_time(dates1, "ym", tz = "CET") [1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET" 

如果date时间数据中存在违规情况,则可以使用truncated参数指定允许的违规情况:

 > parse_date_time(dates2, "ymdHMS", truncated = 3) [1] "2012-06-01 12:23:00 UTC" "2012-06-01 12:00:00 UTC" "2012-06-01 00:00:00 UTC" 

使用的数据:

 dates1 <- c("2009-01","2009-02","2009-03") dates2 <- c("2012-06-01 12:23","2012-06-01 12",'2012-06-01") 

我认为@ ben-rollert的解决scheme是一个很好的解决scheme。

如果你想在一个新包中的函数中使用这个解决scheme,你只需要小心。

开发软件包时,build议使用语法packagename::function_name() (请参阅http://kbroman.org/pkg_primer/pages/depends.html )。

在这种情况下,您必须使用zoo库定义的as.Date()版本。

这里是一个例子:

 > devtools::session_info() Session info ---------------------------------------------------------------------------------------------------------------------------------------------------- setting value version R version 3.3.1 (2016-06-21) system x86_64, linux-gnu ui RStudio (1.0.35) language (EN) collate C tz <NA> date 2016-11-09 Packages -------------------------------------------------------------------------------------------------------------------------------------------------------- package * version date source devtools 1.12.0 2016-06-24 CRAN (R 3.3.1) digest 0.6.10 2016-08-02 CRAN (R 3.2.3) memoise 1.0.0 2016-01-29 CRAN (R 3.2.3) withr 1.0.2 2016-06-20 CRAN (R 3.2.3) > as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) Error in as.Date.default(zoo::as.yearmon("1989-10", "%Y-%m")) : do not know how to convert 'zoo::as.yearmon("1989-10", "%Y-%m")' to class “Date” > zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) [1] "1989-10-01" 

所以如果你正在开发一个软件包,最好的做法是使用:

 zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))