R 是否将年和月(“yyyy-mm”格式)转换为日期?
我的数据集如下所示:R 是否将年和月(“yyyy-mm”格式)转换为日期?,r,date,posix,zoo,r-faq,R,Date,Posix,Zoo,R Faq,我的数据集如下所示: 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 > z Jan 2009 Feb 2009 Mar 2009 Apr 2009 May 2009 Aug 2009 Sep 2009 Oct 2009 12 310 2379 234
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
> 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
我想绘制数据(月份为x值,计数为y值)。由于数据中存在缺口,我想将当月的信息转换为日期。我试过:
as.Date("2009-03", "%Y-%m")
但它没有起作用。怎么了?似乎as.Date()还需要一天,并且无法为该天设置标准值?哪个函数解决了我的问题?因为日期对应一个数值和一个开始日期,所以您确实需要一天。如果您确实需要数据采用日期格式,只需将日期粘贴到日期即可手动将日期固定到每月的第一天:
month <- "2009-03"
as.Date(paste(month,"-01",sep=""))
month试试这个。(这里我们使用text=Lines
来保持示例的自包含性,但实际上我们会将其替换为文件名。)
“yearmon”
也可以单独使用:
> as.yearmon("2000-03")
[1] "Mar 2000"
注意:
“yearmon”
类对象按日历顺序排序
这将以等距间隔绘制月点,这可能是所需的;但是,如果希望以与每月天数成比例的不相等间隔绘制点,则将z
的索引转换为“日期”
类:时间(z)如果需要日期格式,最简洁的解决方案是:
library(zoo)
month <- "2000-03"
as.Date(as.yearmon(month))
[1] "2000-03-01"
图书馆(动物园)
月份事实上,如上所述(以及其他地方),为了将字符串转换为日期,您需要月份的特定日期。从as.Date()
手册页面:
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"
如果日期字符串未完全指定日期,则返回的答案可能是特定于系统的。最常见的行为是假设缺少的年、月或日是当前的年、月或日。如果指定的日期不正确,可靠的实现将给出一个错误,并且该日期报告为NA。不幸的是,一些常见的实现(如glibc
)是不可靠的,只能猜测其预期含义
一个简单的解决方案是将日期“01”
粘贴到每个日期,并使用strtime()
将其指示为该月的第一天
对于那些希望了解更多R中处理日期和时间的背景的人:
在R中,时间使用POSIXct
和POSIXlt
类,日期使用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
要处理日期,您可以使用strtime()
(从手册页面借用这些示例):
strtime(“20/2/06 11:16:16.683”,%d/%m/%y%H:%m:%OS”)
#[1]“2006-02-20 11:16:16东部时间”
#并以矢量化形式:
日期我认为@ben rollert的解决方案是一个很好的解决方案
如果要在新包中的函数中使用此解决方案,只需小心
开发包时,建议使用syntaxpackagename::function_name()
(请参阅)
在这种情况下,必须使用由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"
使用软件包:
您还可以通过lubridate
包中的parse_date_time
或fast_strtime
功能实现这一点:
> 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
需要与strptime
相同的格式规范
要指定时区,可以使用tz
-参数:
> parse_date_time(dates1, "ym", tz = "CET")
[1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET"
当日期时间数据中存在不规则时,可以使用截断的-参数指定允许的不规则数量:
> 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")
dates1还有哪些其他日期格式?我看到了POSIX和ISO,但我不确定它们是否是不同的格式。我认为这些只是函数,…值得注意的是,您可以在格式化程序中将日期指定为相同的日期,因此您可以将指定为.Date(month,format='%Y-%m-01')
并获得相同的结果。这种“感觉”比我更可取,因为在每个月指定相同的日期更多的是日期的格式,而不是字符串操作,但这可能是胡说八道。@JBecker您的建议对我不适用<代码>>作为.日期(“2016-01”,格式=“%Y-%m-01”)#[1]NA
。我使用的是R3.3.1它选择“01-01”有点奇怪,文档中有关于这个选择的信息吗?如果总是选择一个月的第一天,@lmo没有检查文档,我认为这是dd没有选择第一天的“常见”做法。这是有道理的。我模模糊糊地被记住了,然后找到了引发评论的原因。从?strtime
的Note部分:输入字符串不需要完全指定日期:假定未指定的秒、分钟或小时为零,未指定的年、月或日为当前日期。(但是,如果指定了一个月,则该月的日期必须由%d或%e指定,因为该月的当前日期不必对指定的月份有效。)威震天的回答似乎包含了类似于as.Date
的文档。对于1900年之前的年份,它不起作用。例如,在使用parse_date_time
将字符变量转换为date
格式后,我在任何时候('1870-01')
都尝试了这个,有没有一种方法可以以不同于使用lubridate
软件包的“2009-01-01 UTC”
的顺序查看它?我更喜欢在我的数据集中看到第一天,例如01-01-2009
@user63230参见?格式
;e、 g.:格式(您的日期,“%d-%m-%Y”)
。疗法
> 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(dates1, "ym", tz = "CET")
[1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET"
> 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")