Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 是否将年和月(“yyyy-mm”格式)转换为日期?_R_Date_Posix_Zoo_R Faq - Fatal编程技术网

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的解决方案是一个很好的解决方案

    如果要在新包中的函数中使用此解决方案,只需小心

    开发包时,建议使用syntax
    packagename::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")