• R语言已解决
  • 如何从字符串类型的日期数据中分别提取年份、月份

Cloud2016
“非Non-Tidyverse”?

这表达的曲折跟沃森和克里克 DNA 双螺旋论文里那句著名的“It has not escaped our notice ...”有的一拼了。不过我估计你是多打了一字:)

    Liechi 双重否定表否定的英式中文表达法。一定是这样的。完全不影响读者理解。

      Cloud2016

      正则并不特别适合处理日期类的字符串,你写的那一长串regex只是适用于YYYY-mm-dd格式的日期。lubridate::as_date()在识别日期格式方面比base的as.Date()强化不少,举例:

      datestr = c("1970-01-01","19700101","70-01-01")
      
      
      lubridate::as_date(datestr)
      #> [1] "1970-01-01" "1970-01-01" "1970-01-01"
      
      as.Date(datestr)
      #> [1] "1970-01-01" NA           "70-01-01"

      所以我推荐用lubridate…

        tctcab 那一长串正则是我刚开始想的太美好,以为正则的命名捕捉可以实现这样的效果,就是返回值是一个这样的数据框或者列表

        # 数据框
        year  month day
        1970 01 01
        # 列表
        year
        1970
        
        month
        01
        
        day
        01

        lubridate 确实好,大家的方案都比我的好!

        歪个楼,我发现加载 lubridate 出现冲突

        library(lubridate)
        
        Attaching package: ‘lubridate’
        
        The following object is masked from ‘package:base’:
        
            date

        进一步我发现,不加载 lubridate ,自带的 Base R 版 date 和它内容一样,就是 lubridate::date()base::date() 功能是一样的,这纯粹的重复造轮子,目的是迷惑用户以后使用date函数的时候,就固定去安装 lubridate 包

          dapengde 双重否定表否定这种风骚的操作我只在歌里听过:I ain't got no money。

            Cloud2016
            不一样

            base::date()只是返回当前date,不带参数

            lubridate::date() 多了个参数x,当然不带参数的时候还是调用的base::date()

            Liechi

            Sometimes we all do things that, well, just don’t make no sense.
            --- Forrest Gump

            2 个月 后
            1 年 后

            正则表达式版:

            extract_date <- read.table(    
                 text = gsub("^(([0-9]{4})-([0-9]+)-([0-9]+)) .*", "\\1 \\2 \\3 \\4", eq[, 1]),
                 col.names = c("date", "year", "month", "day")
             )
            
            equake <- cbind(eq, extract_date)
            
            head(equake)
            6 天 后

            Cloud2016

            可以来玩玩这个 dtverse,除了切年月日也可以用来切姓和名

            library(dtverse)
            data("dt_dates")
            dt_dates$Start_Date <- as.character(dt_dates$Start_Date)
            dtverse::str_split_col(dt_dates,
                                   by_col = "Start_Date",
                                   by_pattern = "-",
                                   match_to_names = c("Year", "Month", "Day"))
             
               Start_Date   End_Date      Full_name First Name Last Name Year Month Day
            1: 2019-05-01 2019-06-01     Joe, Smith        Joe     Smith 2019    05  01
            2: 2019-08-04 2019-08-09 Alex, Robinson       Alex  Robinson 2019    08  04
            3: 2019-07-05 2019-08-14     David, Big      David       Big 2019    07  05
            4: 2019-07-04 2019-07-05     Julia, Joe      Julia       Joe 2019    07  04
            5: 2019-04-27 2019-05-10  Jessa, Oliver      Jessa    Oliver 2019    04  27

            1 个月 后
            chuxinyuan 更改标题为「如何从字符串类型的日期数据中分别提取年份、月份