如何从字符串类型的日期数据中分别提取年份、月份
正则并不特别适合处理日期类的字符串,你写的那一长串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 包
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 天 后
可以来玩玩这个 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 更改标题为「如何从字符串类型的日期数据中分别提取年份、月份」