“我报名参与金石计划1期挑战——分割10万奖池,这是我的第2篇文章,点击检查活动详情”

10日期型数据格局转化

咱们描述了三种首要类型的向量:数字、字符和逻辑。在数据科学项目中,咱们经常会遇到日期变量。虽然咱们能够用字符串表明日期,例如2017年11月2日,但一旦咱们挑选了一个被称为“历元”的参考日,就能够经过计算自历元起的天数将其转化为数字。计算机言语通常以1970年1月1日为纪元。例如,2017年1月2日是1,1969年12月31日是-1,2017年11月2日是第17204天。 在R中分析数据时,咱们应该怎么表明日期和时刻?咱们接下来看一下详细事例。

10.1 日期数据类型

library(tidyverse)
library(dslabs)
polls_us_election_2016 %>% head()
A data.frame: 6 15
state startdate enddate pollster grade samplesize population rawpoll_clinton rawpoll_trump rawpoll_johnson rawpoll_mcmullin adjpoll_clinton adjpoll_trump adjpoll_johnson adjpoll_mcmullin
<fct> <date> <date> <fct> <fct> <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 U.S. 2016-11-03 2016-11-06 ABC News/Washington Post A+ 2220 lv 47.00 43.00 4.00 NA 45.20163 41.72430 4.626221 NA
2 U.S. 2016-11-01 2016-11-07 Google Consumer Surveys B 26574 lv 38.03 35.69 5.46 NA 43.34557 41.21439 5.175792 NA
3 U.S. 2016-11-02 2016-11-06 Ipsos A- 2195 lv 42.00 39.00 6.00 NA 42.02638 38.81620 6.844734 NA
4 U.S. 2016-11-04 2016-11-07 YouGov B 3677 lv 45.00 41.00 5.00 NA 45.65676 40.92004 6.069454 NA
5 U.S. 2016-11-03 2016-11-06 Gravis Marketing B- 16639 rv 47.00 43.00 3.00 NA 46.84089 42.33184 3.726098 NA
6 U.S. 2016-11-03 2016-11-06 Fox News/Anderson Robbins Research/Shaw & Company Research A 1295 lv 48.00 44.00 3.00 NA 49.02208 43.95631 3.057876 NA
class(polls_us_election_2016$startdate)

‘Date’

看看当咱们把它们转化成数字时会发生什么:

as.numeric(polls_us_election_2016$startdate) %>% head
.list-inline {list-style: none; margin:0; padding: 0} .list-inline>li {display: inline-block} .list-inline>li:not(:last-child)::after {content: “\00b7”; padding: 0 .5ex}
  1. 17108
  2. 17106
  3. 17107
  4. 17109
  5. 17108
  6. 17108

由于主动的将上述日期转化成纪元方法定义

as.Date('1970-01-01') %>% as.numeric

0

绘图功用,例如ggplot中的功用,能够知道日期格局。这意味着,例如,散点图能够运用数字表明来确定点的方位,但在标签中包含字符串:

polls_us_election_2016 %>% filter(pollster == "Ipsos" & state =="U.S.") %>%
  ggplot(aes(startdate, rawpoll_trump)) +
  geom_line()


【R语言数据科学】:(十)数据清洗之日期型数据处理

️10.2 lubridate包

tidyverse包含经过lubridate包处理日期的功用。

library(lubridate)

咱们将随机抽取一个日期数据样本,演示一下怎么运用lubridate包

set.seed(1)
dates <- sample(polls_us_election_2016$startdate, 10) %>% sort
dates
.list-inline {list-style: none; margin:0; padding: 0} .list-inline>li {display: inline-block} .list-inline>li:not(:last-child)::after {content: “\00b7”; padding: 0 .5ex}
  1. 2016-05-19
  2. 2016-08-12
  3. 2016-08-17
  4. 2016-08-29
  5. 2016-09-28
  6. 2016-10-17
  7. 2016-10-23
  8. 2016-10-25
  9. 2016-10-25
  10. 2016-10-28

能够运用year,month,day别离从日期中截取年、月、日

tibble(date = dates,
       month = month(dates),
       day = day(dates),
       year = year(dates))
A tibble: 10 4
date month day year
<date> <dbl> <int> <dbl>
2016-05-19 5 19 2016
2016-08-12 8 12 2016
2016-08-17 8 17 2016
2016-08-29 8 29 2016
2016-09-28 9 28 2016
2016-10-17 10 17 2016
2016-10-23 10 23 2016
2016-10-25 10 25 2016
2016-10-25 10 25 2016
2016-10-28 10 28 2016
month(dates, label = TRUE)
.list-inline {list-style: none; margin:0; padding: 0} .list-inline>li {display: inline-block} .list-inline>li:not(:last-child)::after {content: “\00b7”; padding: 0 .5ex}
  1. 5月
  2. 8月
  3. 8月
  4. 8月
  5. 9月
  6. 10月
  7. 10月
  8. 10月
  9. 10月
  10. 10月
Levels: .list-inline {list-style: none; margin:0; padding: 0} .list-inline>li {display: inline-block} .list-inline>li:not(:last-child)::after {content: “\00b7”; padding: 0 .5ex}
  1. ‘1月’
  2. ‘2月’
  3. ‘3月’
  4. ‘4月’
  5. ‘5月’
  6. ‘6月’
  7. ‘7月’
  8. ‘8月’
  9. ‘9月’
  10. ’10月’
  11. ’11月’
  12. ’12月’

咱们发现上述日期回来的都是中文的,这是由于咱们装置的是中文版的R言语,咱们能够运用下列代码将时刻转化为英文的

Sys.setlocale("LC_TIME", "English")

‘English_United States.1252’

month(dates, label = TRUE)
.list-inline {list-style: none; margin:0; padding: 0} .list-inline>li {display: inline-block} .list-inline>li:not(:last-child)::after {content: “\00b7”; padding: 0 .5ex}
  1. May
  2. Aug
  3. Aug
  4. Aug
  5. Sep
  6. Oct
  7. Oct
  8. Oct
  9. Oct
  10. Oct
Levels: .list-inline {list-style: none; margin:0; padding: 0} .list-inline>li {display: inline-block} .list-inline>li:not(:last-child)::after {content: “\00b7”; padding: 0 .5ex}
  1. ‘Jan’
  2. ‘Feb’
  3. ‘Mar’
  4. ‘Apr’
  5. ‘May’
  6. ‘Jun’
  7. ‘Jul’
  8. ‘Aug’
  9. ‘Sep’
  10. ‘Oct’
  11. ‘Nov’
  12. ‘Dec’

别的一个函数是将字符串转化为日期型,运用ymd()函数,假定日期的格局是YYYY-MM-DD的格局

x <- c(20090901,'2009-01-02','2009 01 03','2009-1-4','2009-1,5','created on 2009 1 6','2009 01 $$$ 07')

能够看出上面我定义的x字符串的内容并不是规范的日期,可是ymd函数能够主动尽量将上述转化成下面的格局,详细如下

ymd(x)
.list-inline {list-style: none; margin:0; padding: 0} .list-inline>li {display: inline-block} .list-inline>li:not(:last-child)::after {content: “\00b7”; padding: 0 .5ex}
  1. 2009-09-01
  2. 2009-01-02
  3. 2009-01-03
  4. 2009-01-04
  5. 2009-01-05
  6. 2009-01-06
  7. 2009-01-07

更复杂的是,日期通常以不同的格局出现。其中年、月和日的顺序不同。首选的格局是显现年份(全部四位数字)、月份(两位数字),然后是日期,这种格局称为ISO 8601。详细来说,咱们运用YYYY-MM-DD,因而如果咱们转化字符串,它将按上述方法排序回来。能够看到函数ymd以这种格局回来它们。

可是,如果你遇到“09/01/02”这样的日期怎么办这可能是2002年9月1日、2009年1月2日或2002年1月9日。在这些情况下,检查整个日期向量能够得到详细的日期成果。一旦咱们知道了,咱们能够运用不同的lubridate包的函数。

例如咱们能够运用mdy函数,表明第一个是月份,第二个是日期,第三个是年份

x <- '09/01/02'
mdy(x)

2002-09-01

dmy(x)

2002-01-09

myd(x)

2001-09-02

dym(x)

2001-02-09

相同lubridate包还能够回来当时日期,并且设定相应的时区

now()
now("GMT")# 表明零时区
[1] "2022-04-23 22:14:18 CST"
[1] "2022-04-23 14:14:18 GMT"

运用OlsonNames()函数查找能够挑选的时区

相同地,咱们能够运用hour,minute,sencond别离回来小时、分钟、秒

now() %>% hour()
now() %>% minute()
now() %>% second()

22

27

31.5012230873108

和ymd()函数类似,在这儿咱们也有hms()函数,回来小时,分钟,秒

x <- c("12:34:56")
hms(x)

12H 34M 56S

注意,这儿hms的顺序不能交换,咱们还能够运用mdy和hms组合得到一个详细的日期型数据

x <- '12 2 2022 22:33:55'
mdy_hms(x)
[1] "2022-12-02 22:33:55 UTC"

最后再介绍两个十分有用的函数,make_dateround_date

make_date,能够回来一个日期型数据,例如咱们想要生成2022年4月23日的日期数据

make_date(2022,4,23)

2022-04-23

咱们还能够生成21世纪20年代的时刻序列

make_date(2020:2029)
.list-inline {list-style: none; margin:0; padding: 0} .list-inline>li {display: inline-block} .list-inline>li:not(:last-child)::after {content: “\00b7”; padding: 0 .5ex}
  1. 2020-01-01
  2. 2021-01-01
  3. 2022-01-01
  4. 2023-01-01
  5. 2024-01-01
  6. 2025-01-01
  7. 2026-01-01
  8. 2027-01-01
  9. 2028-01-01
  10. 2029-01-01

round_date 函数

从字面意义来看,round意味四舍五入,那么在日期型数据中,它会回来某一日期最近的年份,季度,月份,周等

polls_us_election_2016 %>%
  mutate(week = round_date(startdate, "week")) %>%
  group_by(week) %>%
  summarize(margin = mean(rawpoll_clinton - rawpoll_trump)) %>%
  qplot(week, margin, data = .)


【R语言数据科学】:(十)数据清洗之日期型数据处理