美文网首页
35.关于parse系列函数之解析日期和时间

35.关于parse系列函数之解析日期和时间

作者: 心惊梦醒 | 来源:发表于2021-08-19 22:43 被阅读0次

    【上一篇:34.关于parse系列函数之解析因子】
    【下一篇:36.关于readr如何解析文件】

        解析日期和时间的三个函数parse_date()、parse_datetime()、parse_time()的Usage相同:

    parse_date(
      x,
      format = "",
      na = c("", "NA"),
      locale = default_locale(),
      trim_ws = TRUE
    )
    

        x是要解析的日期时间向量,nalocaletrim_ws和其他函数一样。
        format指定一种格式规范,函数会根据给定的格式规范解析x。默认是"",表示按照ISO8601标准解析x,日期格式和时间格式都使用locale()指定的格式。


        下面介绍三个函数默认输入的格式,默认的输入很不灵活,下文中除了提到的可缺省的部分,只要格式不正确,均不能正常解析某种格式在一个函数中默认可解析不一定在另一个函数中默认可解析,只下文中提到的相应格式才能被相应函数正确解析
        R中的日期是相对1970-01-01进行计算的,时间是相对midnight计算的。ISO8601是一个国际标准,其中日期的组成部分从大到小:年、月、日、时、分、秒。
        parse_datetime()函数的返回值是一个带有时区属性(tzone/tz)的POSIXct()向量,不能正确解析或解析出一个无效日期的元素将置为NA。此函数内部是按照从1970-01-01 00:00:00 开始的秒数进行计算的。既然是解析date-time,那date是不可缺省的,time缺省的话就直接设置为midnight了。

    # 返回值是带有时区属性的向量
    > parse_datetime("2010-10-01T2010")
    [1] "2010-10-01 20:10:00 UTC"
    # 如果时间缺省的话,默认设置为midnight
    > parse_datetime("20101010")
    [1] "2010-10-10 UTC"
    

        parse_date()函数内部是按照从1970-01-01开始的天数进行计算的,避免了很多与时区(time zone)相关的麻烦。默认的输入格式是:年/月/日或年-月-日。其他的格式均不能正确解析,如果想正确解析,需要用format指定格式,个人觉得format参数才是重点。

    > parse_date("2010-10-01")
    [1] "2010-10-01"
    > parse_date("2010/10/01")
    [1] "2010-10-01"
    

        parse_time()的默认从midnight开始计算秒数。默认输入格式为:时:分:秒 或者 时:分:秒 am/pm,两者中秒可以缺省,缺省表示00。其他格式默认都不能正常解析。

    > parse_time("01:10:01 am")
    01:10:01
    > parse_time("01:10:01 pm")
    13:10:01
    > parse_time("01:10:01")
    01:10:01
    

        个人觉得这些函数最有用的部分还是format参数。正如我们实际生活中遇到的,关于日期和时间的表示,格式五花八门,通过format参数,告诉函数你的输入是以什么样的格式写的,函数就会根据你指定的格式解析你的输入,最后生成统一的日期时间格式。
        首先需要记住一些格式化要用的术语:
        :%Y(四个数字,例如2021)、%y(2个数字,例如00)

    > parse_date("01/02","%m/%y")
    [1] "2002-01-01"
    > parse_date("01/02","%m/%Y")
    Warning: 1 parsing failure.
    row col        expected actual
      1  -- date like %m/%Y  01/02
    
    [1] NA
    > parse_date("01/2002","%m/%Y")
    [1] "2002-01-01"
    > parse_date("02","%y")
    [1] "2002-01-01"
    

        :%m(2个数字)、%b(月份的缩写,例如"Jan")、%B(月份的全名,例如"January")

    > parse_date("02-Jan","%y-%b")
    [1] "2002-01-01"
    

        :%d(两个数字)、%e(optional leading space)。

    > parse_date("02-January-04","%y-%B-%d")
    [1] "2002-01-04"
    

        记忆:年月日都是小写字母,代表2个数字,大写的年是四位数字;月份有全称和简称,全称是大写,简称是小写;日子有个小写e,不知道是干什么地。
        时间:%H(0-23,即24h制)、%I(0-12,即12h制,必须和%p一起使用)、%p(am/pm)、%M(分钟)、%S(整数秒)、%OS(实数秒)、%Z(时区,例如:America/Chicago)、%z(用与UTC的offset表示的时区,例如:+0800)。
        记忆:时分秒都是大写字母,唯一的一个小写字母表示的是上下午;时区也是大写,小写表示offset。
        非数字:%.(跳过一个非数字字符)、%*(跳过任何非数字字符)。

        如果你在使用非英语的月份(也就是%b或%B)时,需要用locale()函数指定lang参数。date_names_langs()可以查看内置的语言向量,如果内置的语言中没有你想要的,可以用date_names()创建你自己的。

    # janvier是法语的一月份
    > parse_date("1 janvier 2015", "%d %B %Y", locale = locale("fr"))
    [1] "2015-01-01"
    

        回顾locale()函数:

    locale(
      date_names = "en",
      date_format = "%AD",
      time_format = "%AT",
      decimal_mark = ".",
      grouping_mark = ",",
      tz = "UTC",
      encoding = "UTF-8",
      asciify = FALSE
    )
    default_locale()
    

    【上一篇:34.关于parse系列函数之解析因子】
    【下一篇:36.关于readr如何解析文件】

    相关文章

      网友评论

          本文标题:35.关于parse系列函数之解析日期和时间

          本文链接:https://www.haomeiwen.com/subject/zyuabltx.html