Jônatan Tatsch
r format(Sys.Date(), format = '%d-%m-%Y')
Datas e horas são referências temporais e indicam a ordem cronológica dos dados. Em climatologia dados passados na escala diária são suficientes para maioria das pesquisas. Em micrometeorologia é comum o uso de dados na escala sub-horária (até frações de segundo).
Datas e horas podem ser expressas em diferentes formatos o que pode dificultar o reconhecimento e a sua manipulação. Quanto a manipulação frequentemente precisamos extrair componentes das datas e horas.
O R possui várias opções de classes de objetos e pacotes para o tratamento de datas e horas. As três classes principais são:
-
Date
(p.ex. 31/12/2000), para lidar somente com datas, p.ex.:31/12/2000
. -
POSIXct
ePOSIXt
(Date-Time), p.ex.:31/12/2000 14:10:00
, para lidar com datas e horas
Objeto da class Date
são representados internamente no R como o número (inteiro) de dias desde 1 de janeiro de 1970. Essa classe é usada quando não temos interesse no horário do dia. Frações de dias podem ser geradas, mas nesse caso a classe POSIX é melhor nessa situação.
A função Sys.Date()
permite-nos obter a data de hoje em um objeto da classe Date
.
## data atual no computador
(hoje <- Sys.Date())
[1] "2017-03-13"
## classe
class(hoje)
[1] "Date"
typeof(hoje)
[1] "double"
A data parece como um caractere quando mostrada no cursor do R o seu tipo de dado é double
e a classe Date
.
A função unclass()
remove o atributo classe do objeto usado como argumento. No caso de um objeto da classe Date
ele retorna o número usado pelo sistema para representar a data.
## remove o atributo classe do onjeto
ndias <- unclass(hoje)
ndias
[1] 17238
Para recriarmos a data de hoje:
## vamos recriar a data desse dia
(as.Date(x = ndias, origin = "1970-01-01"))
[1] "2017-03-13"
Para reconstruirmos a data que se refere aquele número foi usada a função as.Date()
, que converte para a classe Date
o argumento de entrada (n° de dias decorridos) a partir da data de origem.
Podemos extrair partes ou informações de objetos na classe Date
. Nesse caso a informação será convertida para character
. Essas informações podem ser o ano, dia, mês, por exemplo.
## qual o ano da data de hoje
format(hoje, "%Y")
[1] "2017"
## qual o mes da data de hoje
format(hoje, "%m");format(hoje, "%b")
[1] "03"
[1] "Mar"
## qual o dia da data de hoje
format(hoje, "%d")
[1] "13"
## qual o dia do ano da data de hoje
format(hoje, "%j")
[1] "072"
Podemos manipular o formato de saída da data.
format(hoje, "%d%b%Y")
[1] "13Mar2017"
format(hoje, "%d/%m/%Y")
[1] "13/03/2017"
format(hoje, "%d_%m_%Y.txt")
[1] "13_03_2017.txt"
format(hoje, "Hoje é %d de %B de %Y.")
[1] "Hoje é 13 de março de 2017."
Existem algumas funções prontas para extrair informações padrões, como:
months(hoje)
[1] "março"
weekdays(hoje)
[1] "segunda"
O dia correspondente no calendário juliano. Para saber mais sobre dia juliano veja aqui.
julian(hoje)
[1] 17238
attr(,"origin")
[1] "1970-01-01"
A função format()
permite representar um objeto da classe Date
de muitas formas. Através do seu segundo argumento é possível formatar uma data em inúmeros formatos.
Consulte o help
da função strptime
para saber mais sobre estas variantes.
help(strptime)
Um procedimento mais frequente é a conversão de uma string ou caractere de um arquivo texto para um objeto da classe Date
.
# vetor de caracteres com datas
dts <- c("2/2/2001", "04/4/2003", "03/03/2002", "5/05/2004", "1/1/2000")
datas <- as.Date(dts, format = "%d/%m/%Y")
class(datas)
[1] "Date"
Suponha que tivesse arquivos nomeados da seguinte forma:
arqs <- format(datas, "%d%b%y.txt")
arqs
[1] "02Fev01.txt" "04Abr03.txt" "03Mar02.txt" "05Mai04.txt" "01Jan00.txt"
# obter datas a partir do nome dos arquivos
as.Date(arqs, "%d%b%y.txt")
[1] "2001-02-02" "2003-04-04" "2002-03-03" "2004-05-05" "2000-01-01"
## ordenar os arquivos pela data
arqs_dates <- as.Date(arqs, "%d%b%y.txt")
arqs[order(arqs_dates)]
[1] "01Jan00.txt" "02Fev01.txt" "03Mar02.txt" "04Abr03.txt" "05Mai04.txt"
Vamos criar um data frame com informações de ano, mês e dia e então convertê-las em um objeto da classe Date
.
eg <- expand.grid(dias = 1:31, mes = 1:12 ,anos = 2000:2001)
head(eg)
dias mes anos
1 1 1 2000
2 2 1 2000
3 3 1 2000
4 4 1 2000
5 5 1 2000
6 6 1 2000
tail(eg)
dias mes anos
739 26 12 2001
740 27 12 2001
741 28 12 2001
742 29 12 2001
743 30 12 2001
744 31 12 2001
char_dates <- paste(eg$anos, eg$mes, eg$dias, sep = "-")
head(char_dates)
[1] "2000-1-1" "2000-1-2" "2000-1-3" "2000-1-4" "2000-1-5" "2000-1-6"
datas_eg <- as.Date(char_dates)
class(datas_eg)
[1] "Date"
# foram criados NAs, pq?
datas_eg[55:70]
[1] "2000-02-24" "2000-02-25" "2000-02-26" "2000-02-27" "2000-02-28"
[6] "2000-02-29" NA NA "2000-03-01" "2000-03-02"
[11] "2000-03-03" "2000-03-04" "2000-03-05" "2000-03-06" "2000-03-07"
[16] "2000-03-08"
head(datas_eg)
[1] "2000-01-01" "2000-01-02" "2000-01-03" "2000-01-04" "2000-01-05"
[6] "2000-01-06"
tail(datas_eg)
[1] "2001-12-26" "2001-12-27" "2001-12-28" "2001-12-29" "2001-12-30"
[6] "2001-12-31"
## removendo datas inexistentes
datas_eg_ok <- datas_eg[!is.na(datas_eg)]
head(datas_eg_ok, 10)
[1] "2000-01-01" "2000-01-02" "2000-01-03" "2000-01-04" "2000-01-05"
[6] "2000-01-06" "2000-01-07" "2000-01-08" "2000-01-09" "2000-01-10"
# sequencia de datas diarias
datas_1d <- seq(from = as.Date("2000-01-01"), as.Date("2001-12-31"), by = "days")
head(datas_1d, 32)
[1] "2000-01-01" "2000-01-02" "2000-01-03" "2000-01-04" "2000-01-05"
[6] "2000-01-06" "2000-01-07" "2000-01-08" "2000-01-09" "2000-01-10"
[11] "2000-01-11" "2000-01-12" "2000-01-13" "2000-01-14" "2000-01-15"
[16] "2000-01-16" "2000-01-17" "2000-01-18" "2000-01-19" "2000-01-20"
[21] "2000-01-21" "2000-01-22" "2000-01-23" "2000-01-24" "2000-01-25"
[26] "2000-01-26" "2000-01-27" "2000-01-28" "2000-01-29" "2000-01-30"
[31] "2000-01-31" "2000-02-01"
tail(datas_1d, 32)
[1] "2001-11-30" "2001-12-01" "2001-12-02" "2001-12-03" "2001-12-04"
[6] "2001-12-05" "2001-12-06" "2001-12-07" "2001-12-08" "2001-12-09"
[11] "2001-12-10" "2001-12-11" "2001-12-12" "2001-12-13" "2001-12-14"
[16] "2001-12-15" "2001-12-16" "2001-12-17" "2001-12-18" "2001-12-19"
[21] "2001-12-20" "2001-12-21" "2001-12-22" "2001-12-23" "2001-12-24"
[26] "2001-12-25" "2001-12-26" "2001-12-27" "2001-12-28" "2001-12-29"
[31] "2001-12-30" "2001-12-31"
# quantos dias por mês em cada ano
table(format(datas_1d, "%m"), format(datas_1d, "%Y"))
2000 2001
01 31 31
02 29 28
03 31 31
04 30 30
05 31 31
06 30 30
07 31 31
08 31 31
09 30 30
10 31 31
11 30 30
12 31 31
# quantos dias por ano
table(format(datas_1d, "%Y"))
2000 2001
366 365
## sequencia de pentadas
pentadas <- seq(from = as.Date("2000-01-01"), as.Date("2001-12-31"), by = "5 days")
pentadas
[1] "2000-01-01" "2000-01-06" "2000-01-11" "2000-01-16" "2000-01-21"
[6] "2000-01-26" "2000-01-31" "2000-02-05" "2000-02-10" "2000-02-15"
[11] "2000-02-20" "2000-02-25" "2000-03-01" "2000-03-06" "2000-03-11"
[16] "2000-03-16" "2000-03-21" "2000-03-26" "2000-03-31" "2000-04-05"
[21] "2000-04-10" "2000-04-15" "2000-04-20" "2000-04-25" "2000-04-30"
[26] "2000-05-05" "2000-05-10" "2000-05-15" "2000-05-20" "2000-05-25"
[31] "2000-05-30" "2000-06-04" "2000-06-09" "2000-06-14" "2000-06-19"
[36] "2000-06-24" "2000-06-29" "2000-07-04" "2000-07-09" "2000-07-14"
[41] "2000-07-19" "2000-07-24" "2000-07-29" "2000-08-03" "2000-08-08"
[46] "2000-08-13" "2000-08-18" "2000-08-23" "2000-08-28" "2000-09-02"
[51] "2000-09-07" "2000-09-12" "2000-09-17" "2000-09-22" "2000-09-27"
[56] "2000-10-02" "2000-10-07" "2000-10-12" "2000-10-17" "2000-10-22"
[61] "2000-10-27" "2000-11-01" "2000-11-06" "2000-11-11" "2000-11-16"
[66] "2000-11-21" "2000-11-26" "2000-12-01" "2000-12-06" "2000-12-11"
[71] "2000-12-16" "2000-12-21" "2000-12-26" "2000-12-31" "2001-01-05"
[76] "2001-01-10" "2001-01-15" "2001-01-20" "2001-01-25" "2001-01-30"
[81] "2001-02-04" "2001-02-09" "2001-02-14" "2001-02-19" "2001-02-24"
[86] "2001-03-01" "2001-03-06" "2001-03-11" "2001-03-16" "2001-03-21"
[91] "2001-03-26" "2001-03-31" "2001-04-05" "2001-04-10" "2001-04-15"
[96] "2001-04-20" "2001-04-25" "2001-04-30" "2001-05-05" "2001-05-10"
[101] "2001-05-15" "2001-05-20" "2001-05-25" "2001-05-30" "2001-06-04"
[106] "2001-06-09" "2001-06-14" "2001-06-19" "2001-06-24" "2001-06-29"
[111] "2001-07-04" "2001-07-09" "2001-07-14" "2001-07-19" "2001-07-24"
[116] "2001-07-29" "2001-08-03" "2001-08-08" "2001-08-13" "2001-08-18"
[121] "2001-08-23" "2001-08-28" "2001-09-02" "2001-09-07" "2001-09-12"
[126] "2001-09-17" "2001-09-22" "2001-09-27" "2001-10-02" "2001-10-07"
[131] "2001-10-12" "2001-10-17" "2001-10-22" "2001-10-27" "2001-11-01"
[136] "2001-11-06" "2001-11-11" "2001-11-16" "2001-11-21" "2001-11-26"
[141] "2001-12-01" "2001-12-06" "2001-12-11" "2001-12-16" "2001-12-21"
[146] "2001-12-26" "2001-12-31"
length(pentadas)
[1] 147
## quantas pentadas por ano
table(format(pentadas, "%Y"))
2000 2001
74 73
# quantas pentadas por mês e ano
table(format(pentadas, "%Y"), format(pentadas, "%m"))
01 02 03 04 05 06 07 08 09 10 11 12
2000 7 5 7 6 6 6 6 6 6 6 6 7
2001 6 5 7 6 6 6 6 6 6 6 6 7
## sequencia de meses
datas_15s <- seq(from = as.Date("2000-01-15"), as.Date("2001-12-15"), by = "months")
datas_15s
[1] "2000-01-15" "2000-02-15" "2000-03-15" "2000-04-15" "2000-05-15"
[6] "2000-06-15" "2000-07-15" "2000-08-15" "2000-09-15" "2000-10-15"
[11] "2000-11-15" "2000-12-15" "2001-01-15" "2001-02-15" "2001-03-15"
[16] "2001-04-15" "2001-05-15" "2001-06-15" "2001-07-15" "2001-08-15"
[21] "2001-09-15" "2001-10-15" "2001-11-15" "2001-12-15"
## diferença enre datas
as.Date("2006-9-23") - as.Date("2003-04-30")
Time difference of 1242 days
## diferença entre cada dia de um vetor de datas
diff(pentadas)
Time differences in days
[1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[36] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[71] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[106] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[141] 5 5 5 5 5 5
## útil para verificação de continuidade temporal
datas_irreg <- datas_1d[-c(10, 100, 201, 303, 405, 506)]
difs <- diff(datas_irreg)
difs
Time differences in days
[1] 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[36] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[71] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1
[106] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[141] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[176] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1
[211] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[246] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[281] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[316] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[351] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[386] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[421] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[456] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[491] 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[526] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[561] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[596] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[631] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[666] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[701] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## encontrado datas descontínuas
datas_irreg[c(1, difs) == 2]
[1] "2000-01-11" "2000-04-10" "2000-07-20" "2000-10-30" "2001-02-09"
[6] "2001-05-21"
## só os primeiros 203 elementos
df <- data.frame(d = datas_irreg[1:203], i = (c(1, difs) == 2)[1:203])
df
d i
1 2000-01-01 FALSE
2 2000-01-02 FALSE
3 2000-01-03 FALSE
4 2000-01-04 FALSE
5 2000-01-05 FALSE
6 2000-01-06 FALSE
7 2000-01-07 FALSE
8 2000-01-08 FALSE
9 2000-01-09 FALSE
10 2000-01-11 TRUE
11 2000-01-12 FALSE
12 2000-01-13 FALSE
13 2000-01-14 FALSE
14 2000-01-15 FALSE
15 2000-01-16 FALSE
16 2000-01-17 FALSE
17 2000-01-18 FALSE
18 2000-01-19 FALSE
19 2000-01-20 FALSE
20 2000-01-21 FALSE
21 2000-01-22 FALSE
22 2000-01-23 FALSE
23 2000-01-24 FALSE
24 2000-01-25 FALSE
25 2000-01-26 FALSE
26 2000-01-27 FALSE
27 2000-01-28 FALSE
28 2000-01-29 FALSE
29 2000-01-30 FALSE
30 2000-01-31 FALSE
31 2000-02-01 FALSE
32 2000-02-02 FALSE
33 2000-02-03 FALSE
34 2000-02-04 FALSE
35 2000-02-05 FALSE
36 2000-02-06 FALSE
37 2000-02-07 FALSE
38 2000-02-08 FALSE
39 2000-02-09 FALSE
40 2000-02-10 FALSE
41 2000-02-11 FALSE
42 2000-02-12 FALSE
43 2000-02-13 FALSE
44 2000-02-14 FALSE
45 2000-02-15 FALSE
46 2000-02-16 FALSE
47 2000-02-17 FALSE
48 2000-02-18 FALSE
49 2000-02-19 FALSE
50 2000-02-20 FALSE
51 2000-02-21 FALSE
52 2000-02-22 FALSE
53 2000-02-23 FALSE
54 2000-02-24 FALSE
55 2000-02-25 FALSE
56 2000-02-26 FALSE
57 2000-02-27 FALSE
58 2000-02-28 FALSE
59 2000-02-29 FALSE
60 2000-03-01 FALSE
61 2000-03-02 FALSE
62 2000-03-03 FALSE
63 2000-03-04 FALSE
64 2000-03-05 FALSE
65 2000-03-06 FALSE
66 2000-03-07 FALSE
67 2000-03-08 FALSE
68 2000-03-09 FALSE
69 2000-03-10 FALSE
70 2000-03-11 FALSE
71 2000-03-12 FALSE
72 2000-03-13 FALSE
73 2000-03-14 FALSE
74 2000-03-15 FALSE
75 2000-03-16 FALSE
76 2000-03-17 FALSE
77 2000-03-18 FALSE
78 2000-03-19 FALSE
79 2000-03-20 FALSE
80 2000-03-21 FALSE
81 2000-03-22 FALSE
82 2000-03-23 FALSE
83 2000-03-24 FALSE
84 2000-03-25 FALSE
85 2000-03-26 FALSE
86 2000-03-27 FALSE
87 2000-03-28 FALSE
88 2000-03-29 FALSE
89 2000-03-30 FALSE
90 2000-03-31 FALSE
91 2000-04-01 FALSE
92 2000-04-02 FALSE
93 2000-04-03 FALSE
94 2000-04-04 FALSE
95 2000-04-05 FALSE
96 2000-04-06 FALSE
97 2000-04-07 FALSE
98 2000-04-08 FALSE
99 2000-04-10 TRUE
100 2000-04-11 FALSE
101 2000-04-12 FALSE
102 2000-04-13 FALSE
103 2000-04-14 FALSE
104 2000-04-15 FALSE
105 2000-04-16 FALSE
106 2000-04-17 FALSE
107 2000-04-18 FALSE
108 2000-04-19 FALSE
109 2000-04-20 FALSE
110 2000-04-21 FALSE
111 2000-04-22 FALSE
112 2000-04-23 FALSE
113 2000-04-24 FALSE
114 2000-04-25 FALSE
115 2000-04-26 FALSE
116 2000-04-27 FALSE
117 2000-04-28 FALSE
118 2000-04-29 FALSE
119 2000-04-30 FALSE
120 2000-05-01 FALSE
121 2000-05-02 FALSE
122 2000-05-03 FALSE
123 2000-05-04 FALSE
124 2000-05-05 FALSE
125 2000-05-06 FALSE
126 2000-05-07 FALSE
127 2000-05-08 FALSE
128 2000-05-09 FALSE
129 2000-05-10 FALSE
130 2000-05-11 FALSE
131 2000-05-12 FALSE
132 2000-05-13 FALSE
133 2000-05-14 FALSE
134 2000-05-15 FALSE
135 2000-05-16 FALSE
136 2000-05-17 FALSE
137 2000-05-18 FALSE
138 2000-05-19 FALSE
139 2000-05-20 FALSE
140 2000-05-21 FALSE
141 2000-05-22 FALSE
142 2000-05-23 FALSE
143 2000-05-24 FALSE
144 2000-05-25 FALSE
145 2000-05-26 FALSE
146 2000-05-27 FALSE
147 2000-05-28 FALSE
148 2000-05-29 FALSE
149 2000-05-30 FALSE
150 2000-05-31 FALSE
151 2000-06-01 FALSE
152 2000-06-02 FALSE
153 2000-06-03 FALSE
154 2000-06-04 FALSE
155 2000-06-05 FALSE
156 2000-06-06 FALSE
157 2000-06-07 FALSE
158 2000-06-08 FALSE
159 2000-06-09 FALSE
160 2000-06-10 FALSE
161 2000-06-11 FALSE
162 2000-06-12 FALSE
163 2000-06-13 FALSE
164 2000-06-14 FALSE
165 2000-06-15 FALSE
166 2000-06-16 FALSE
167 2000-06-17 FALSE
168 2000-06-18 FALSE
169 2000-06-19 FALSE
170 2000-06-20 FALSE
171 2000-06-21 FALSE
172 2000-06-22 FALSE
173 2000-06-23 FALSE
174 2000-06-24 FALSE
175 2000-06-25 FALSE
176 2000-06-26 FALSE
177 2000-06-27 FALSE
178 2000-06-28 FALSE
179 2000-06-29 FALSE
180 2000-06-30 FALSE
181 2000-07-01 FALSE
182 2000-07-02 FALSE
183 2000-07-03 FALSE
184 2000-07-04 FALSE
185 2000-07-05 FALSE
186 2000-07-06 FALSE
187 2000-07-07 FALSE
188 2000-07-08 FALSE
189 2000-07-09 FALSE
190 2000-07-10 FALSE
191 2000-07-11 FALSE
192 2000-07-12 FALSE
193 2000-07-13 FALSE
194 2000-07-14 FALSE
195 2000-07-15 FALSE
196 2000-07-16 FALSE
197 2000-07-17 FALSE
198 2000-07-18 FALSE
199 2000-07-20 TRUE
200 2000-07-21 FALSE
201 2000-07-22 FALSE
202 2000-07-23 FALSE
203 2000-07-24 FALSE
## quantos dias por semana há na série de datas
table(cut(datas_irreg, "weeks"))
1999-12-27 2000-01-03 2000-01-10 2000-01-17 2000-01-24 2000-01-31
2 7 6 7 7 7
2000-02-07 2000-02-14 2000-02-21 2000-02-28 2000-03-06 2000-03-13
7 7 7 7 7 7
2000-03-20 2000-03-27 2000-04-03 2000-04-10 2000-04-17 2000-04-24
7 7 6 7 7 7
2000-05-01 2000-05-08 2000-05-15 2000-05-22 2000-05-29 2000-06-05
7 7 7 7 7 7
2000-06-12 2000-06-19 2000-06-26 2000-07-03 2000-07-10 2000-07-17
7 7 7 7 7 6
2000-07-24 2000-07-31 2000-08-07 2000-08-14 2000-08-21 2000-08-28
7 7 7 7 7 7
2000-09-04 2000-09-11 2000-09-18 2000-09-25 2000-10-02 2000-10-09
7 7 7 7 7 7
2000-10-16 2000-10-23 2000-10-30 2000-11-06 2000-11-13 2000-11-20
7 6 7 7 7 7
2000-11-27 2000-12-04 2000-12-11 2000-12-18 2000-12-25 2001-01-01
7 7 7 7 7 7
2001-01-08 2001-01-15 2001-01-22 2001-01-29 2001-02-05 2001-02-12
7 7 7 7 6 7
2001-02-19 2001-02-26 2001-03-05 2001-03-12 2001-03-19 2001-03-26
7 7 7 7 7 7
2001-04-02 2001-04-09 2001-04-16 2001-04-23 2001-04-30 2001-05-07
7 7 7 7 7 7
2001-05-14 2001-05-21 2001-05-28 2001-06-04 2001-06-11 2001-06-18
6 7 7 7 7 7
2001-06-25 2001-07-02 2001-07-09 2001-07-16 2001-07-23 2001-07-30
7 7 7 7 7 7
2001-08-06 2001-08-13 2001-08-20 2001-08-27 2001-09-03 2001-09-10
7 7 7 7 7 7
2001-09-17 2001-09-24 2001-10-01 2001-10-08 2001-10-15 2001-10-22
7 7 7 7 7 7
2001-10-29 2001-11-05 2001-11-12 2001-11-19 2001-11-26 2001-12-03
7 7 7 7 7 7
2001-12-10 2001-12-17 2001-12-24 2001-12-31
7 7 7 1
## dias por mes
table(cut(pentadas, "month"))
2000-01-01 2000-02-01 2000-03-01 2000-04-01 2000-05-01 2000-06-01
7 5 7 6 6 6
2000-07-01 2000-08-01 2000-09-01 2000-10-01 2000-11-01 2000-12-01
6 6 6 6 6 7
2001-01-01 2001-02-01 2001-03-01 2001-04-01 2001-05-01 2001-06-01
6 5 7 6 6 6
2001-07-01 2001-08-01 2001-09-01 2001-10-01 2001-11-01 2001-12-01
6 6 6 6 6 7
Este tipo de objeto permite guardar registros temporais com informação sobre a data, como os anteriores, mas também sobre as horas, minutos e segundos. Existem duas sub-classes de POSIXt
:
-
POSIXct
que representam as datas como o número de segundos que passaram desde 1970. -
POSIXlt
que representam as datas como uma lista com várias componentes, como:sec
,min
,hour
,mday
,mon
,year
e etc.
A função Sys.time()
obtém a data/hora atual no computador num objeto do
tipo POSIXt
.
## data e hora atual informada pelo sistema
dt <- Sys.time()
dt
[1] "2017-03-13 18:55:55 UTC"
## numero de segundos desde 1970
unclass(dt)
[1] 1489431355
## mostrando número preservando o formato inteiro
print(unclass(dt), digits = 10)
[1] 1489431355
A função as.POSIXlt()
pode ser usada para converter diferentes
objetos para a classe POSIXlt
. Vamos também converter a data e hora para outro fuso horário.
# definindo globalmente tz = "GMT"
# evita de ter que estar especificando tz = "GMT"
# Sys.setenv(TZ = 'GMT')
dt_lt <- as.POSIXlt(Sys.time(), tz = "GMT")
dt_lt
[1] "2017-03-13 18:55:55 GMT"
as.POSIXlt(Sys.time(), tz = "UTC")
[1] "2017-03-13 18:55:55 UTC"
class(dt_lt)
[1] "POSIXlt" "POSIXt"
## qual fuso horário indicado pelo sistema operacional
Sys.timezone()
[1] "UTC"
Que horas corresponde esse horário em Londres? Para detalhes sobre as strings usadas para os fusos horários veja aqui.
as.POSIXlt(Sys.time(), tz = "Europe/London")
[1] "2017-03-13 18:55:55 GMT"
as.POSIXlt(Sys.time(), tz = "America/Los_Angeles")
[1] "2017-03-13 11:55:55 PDT"
Uma lista com nomes dos fusos horários por continente/cidade ? fornecido pela função OlsonNames()
.
OlsonNames()[56:190]
[1] "America/Anchorage" "America/Anguilla"
[3] "America/Antigua" "America/Araguaina"
[5] "America/Argentina/Buenos_Aires" "America/Argentina/Catamarca"
[7] "America/Argentina/ComodRivadavia" "America/Argentina/Cordoba"
[9] "America/Argentina/Jujuy" "America/Argentina/La_Rioja"
[11] "America/Argentina/Mendoza" "America/Argentina/Rio_Gallegos"
[13] "America/Argentina/Salta" "America/Argentina/San_Juan"
[15] "America/Argentina/San_Luis" "America/Argentina/Tucuman"
[17] "America/Argentina/Ushuaia" "America/Aruba"
[19] "America/Asuncion" "America/Atikokan"
[21] "America/Atka" "America/Bahia"
[23] "America/Bahia_Banderas" "America/Barbados"
[25] "America/Belem" "America/Belize"
[27] "America/Blanc-Sablon" "America/Boa_Vista"
[29] "America/Bogota" "America/Boise"
[31] "America/Buenos_Aires" "America/Cambridge_Bay"
[33] "America/Campo_Grande" "America/Cancun"
[35] "America/Caracas" "America/Catamarca"
[37] "America/Cayenne" "America/Cayman"
[39] "America/Chicago" "America/Chihuahua"
[41] "America/Coral_Harbour" "America/Cordoba"
[43] "America/Costa_Rica" "America/Creston"
[45] "America/Cuiaba" "America/Curacao"
[47] "America/Danmarkshavn" "America/Dawson"
[49] "America/Dawson_Creek" "America/Denver"
[51] "America/Detroit" "America/Dominica"
[53] "America/Edmonton" "America/Eirunepe"
[55] "America/El_Salvador" "America/Ensenada"
[57] "America/Fortaleza" "America/Fort_Nelson"
[59] "America/Fort_Wayne" "America/Glace_Bay"
[61] "America/Godthab" "America/Goose_Bay"
[63] "America/Grand_Turk" "America/Grenada"
[65] "America/Guadeloupe" "America/Guatemala"
[67] "America/Guayaquil" "America/Guyana"
[69] "America/Halifax" "America/Havana"
[71] "America/Hermosillo" "America/Indiana/Indianapolis"
[73] "America/Indiana/Knox" "America/Indiana/Marengo"
[75] "America/Indiana/Petersburg" "America/Indianapolis"
[77] "America/Indiana/Tell_City" "America/Indiana/Vevay"
[79] "America/Indiana/Vincennes" "America/Indiana/Winamac"
[81] "America/Inuvik" "America/Iqaluit"
[83] "America/Jamaica" "America/Jujuy"
[85] "America/Juneau" "America/Kentucky/Louisville"
[87] "America/Kentucky/Monticello" "America/Knox_IN"
[89] "America/Kralendijk" "America/La_Paz"
[91] "America/Lima" "America/Los_Angeles"
[93] "America/Louisville" "America/Lower_Princes"
[95] "America/Maceio" "America/Managua"
[97] "America/Manaus" "America/Marigot"
[99] "America/Martinique" "America/Matamoros"
[101] "America/Mazatlan" "America/Mendoza"
[103] "America/Menominee" "America/Merida"
[105] "America/Metlakatla" "America/Mexico_City"
[107] "America/Miquelon" "America/Moncton"
[109] "America/Monterrey" "America/Montevideo"
[111] "America/Montreal" "America/Montserrat"
[113] "America/Nassau" "America/New_York"
[115] "America/Nipigon" "America/Nome"
[117] "America/Noronha" "America/North_Dakota/Beulah"
[119] "America/North_Dakota/Center" "America/North_Dakota/New_Salem"
[121] "America/Ojinaga" "America/Panama"
[123] "America/Pangnirtung" "America/Paramaribo"
[125] "America/Phoenix" "America/Port-au-Prince"
[127] "America/Porto_Acre" "America/Port_of_Spain"
[129] "America/Porto_Velho" "America/Puerto_Rico"
[131] "America/Rainy_River" "America/Rankin_Inlet"
[133] "America/Recife" "America/Regina"
[135] "America/Resolute"
Convertendo para POSIXct para determinar intervalos de tempo.
as.POSIXct("2006-12-23 12:45") - as.POSIXct("2006-12-21 21:54")
Time difference of 1.61875 days
Qual a hora à 3 horas atrás?
as.POSIXct("2006-12-23 12:45") - 3600*3
[1] "2006-12-23 09:45:00 UTC"
A função format()
que já vimos anteriormente, funciona também para objetos POSIXt
.
format(Sys.time(), "%a %b %d %X %Y %Z")
[1] "Seg Mar 13 18:55:55 2017 UTC"
Ao importar dados que envolvem datas geralmente recebemos essas datas como strings ou character
, e portanto temos que extrair dessas strings as nossas datas/horas. Entretanto não existe uma padrão seguido por todos para representar datas.
Por isso usamos a função strptime()
que pode ser usada para extrair datas/horas de strings indicando o formato em que essas datas/horas estão representadas nas strings. Isso é feito através do segundo argumento da função que usa um conjunto de códigos com vários significados, análogo ao que vimos na função format()
. Para mais detalhes sobre estes códigos veja o help da função.
Note que a função format()
é usado para conversão de POSIXt
ou Date
para caractere. A strptime()
converte vetores caracteres para classe POSIXlt
.
## vetor de caracteres com informação de data
x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
strptime(x, format = "%d%b%Y")
[1] "1960-01-01 UTC" "1960-01-02 UTC" "1960-03-31 UTC" "1960-07-30 UTC"
## vetores caracteres com informações de data e hora
datas <- c("02/27/92", "02/27/92", "01/14/92", "02/28/92", "02/01/92")
horas <- c("23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26")
## convertendo para formato padrão de data e hora do POSIXt
x <- paste(datas, horas, sep = " ")
x_pxlt <- strptime(x, "%m/%d/%y %H:%M:%S", tz = "GMT")
x_pxlt
[1] "1992-02-27 23:03:20 GMT" "1992-02-27 22:29:56 GMT"
[3] "1992-01-14 01:03:30 GMT" "1992-02-28 18:21:03 GMT"
[5] "1992-02-01 16:56:26 GMT"
str(x_pxlt)
POSIXlt[1:5], format: "1992-02-27 23:03:20" "1992-02-27 22:29:56" ...
## mesma operação usando as.POSIXct
x_pxct <- as.POSIXct(x, format = "%m/%d/%y %H:%M:%S", tz = "GMT")
x_pxct
[1] "1992-02-27 23:03:20 GMT" "1992-02-27 22:29:56 GMT"
[3] "1992-01-14 01:03:30 GMT" "1992-02-28 18:21:03 GMT"
[5] "1992-02-01 16:56:26 GMT"
str(x_pxct)
POSIXct[1:5], format: "1992-02-27 23:03:20" "1992-02-27 22:29:56" ...
## extrair horas minutos e segundos
require(chron) # se não tiver instalado: install.packages("chron")
minutes(x_pxct)
[1] 3 29 3 21 56
hours(x_pxct)
[1] 23 22 1 18 16
seconds(x_pxct)
[1] 20 56 30 3 26
months(x_pxct)
[1] "fevereiro" "fevereiro" "janeiro" "fevereiro" "fevereiro"
days(x_pxct)
[1] 27 27 14 28 1
31 Levels: 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < 11 < 12 < ... < 31
years(x_pxct)
[1] 1992 1992 1992 1992 1992
Levels: 1992
## convertendo datas e horas de caracteres para POSIXct
eg <- expand.grid(minutos = c(0,30),
horas = 0:23,
dias = 1:10,
mes = 7 ,
anos = 2000)
head(eg, 20)
minutos horas dias mes anos
1 0 0 1 7 2000
2 30 0 1 7 2000
3 0 1 1 7 2000
4 30 1 1 7 2000
5 0 2 1 7 2000
6 30 2 1 7 2000
7 0 3 1 7 2000
8 30 3 1 7 2000
9 0 4 1 7 2000
10 30 4 1 7 2000
11 0 5 1 7 2000
12 30 5 1 7 2000
13 0 6 1 7 2000
14 30 6 1 7 2000
15 0 7 1 7 2000
16 30 7 1 7 2000
17 0 8 1 7 2000
18 30 8 1 7 2000
19 0 9 1 7 2000
20 30 9 1 7 2000
dth <- do.call("paste", c(eg, sep = " "))
head(dth, 20)
[1] "0 0 1 7 2000" "30 0 1 7 2000" "0 1 1 7 2000" "30 1 1 7 2000"
[5] "0 2 1 7 2000" "30 2 1 7 2000" "0 3 1 7 2000" "30 3 1 7 2000"
[9] "0 4 1 7 2000" "30 4 1 7 2000" "0 5 1 7 2000" "30 5 1 7 2000"
[13] "0 6 1 7 2000" "30 6 1 7 2000" "0 7 1 7 2000" "30 7 1 7 2000"
[17] "0 8 1 7 2000" "30 8 1 7 2000" "0 9 1 7 2000" "30 9 1 7 2000"
dth_psxct <- as.POSIXct(dth, format = "%M %H %d %m %Y", tz = "GMT")
head(dth_psxct, 20)
[1] "2000-07-01 00:00:00 GMT" "2000-07-01 00:30:00 GMT"
[3] "2000-07-01 01:00:00 GMT" "2000-07-01 01:30:00 GMT"
[5] "2000-07-01 02:00:00 GMT" "2000-07-01 02:30:00 GMT"
[7] "2000-07-01 03:00:00 GMT" "2000-07-01 03:30:00 GMT"
[9] "2000-07-01 04:00:00 GMT" "2000-07-01 04:30:00 GMT"
[11] "2000-07-01 05:00:00 GMT" "2000-07-01 05:30:00 GMT"
[13] "2000-07-01 06:00:00 GMT" "2000-07-01 06:30:00 GMT"
[15] "2000-07-01 07:00:00 GMT" "2000-07-01 07:30:00 GMT"
[17] "2000-07-01 08:00:00 GMT" "2000-07-01 08:30:00 GMT"
[19] "2000-07-01 09:00:00 GMT" "2000-07-01 09:30:00 GMT"
## intervalo de variação
range(dth_psxct)
[1] "2000-07-01 00:00:00 GMT" "2000-07-10 23:30:00 GMT"
## convertendo de POSIXct para Date
dth_psxct_date <- as.Date(dth_psxct)
head(dth_psxct_date, 20)
[1] "2000-07-01" "2000-07-01" "2000-07-01" "2000-07-01" "2000-07-01"
[6] "2000-07-01" "2000-07-01" "2000-07-01" "2000-07-01" "2000-07-01"
[11] "2000-07-01" "2000-07-01" "2000-07-01" "2000-07-01" "2000-07-01"
[16] "2000-07-01" "2000-07-01" "2000-07-01" "2000-07-01" "2000-07-01"
## sequencia de datas de meia-hora
dhh <- seq(from = as.POSIXct("2000-01-01 01:30:00", tz = "GMT"),
to = as.POSIXct("2001-12-31 02:30:00", tz = "GMT"),
by = "30 min")
head(dhh, 100)
[1] "2000-01-01 01:30:00 GMT" "2000-01-01 02:00:00 GMT"
[3] "2000-01-01 02:30:00 GMT" "2000-01-01 03:00:00 GMT"
[5] "2000-01-01 03:30:00 GMT" "2000-01-01 04:00:00 GMT"
[7] "2000-01-01 04:30:00 GMT" "2000-01-01 05:00:00 GMT"
[9] "2000-01-01 05:30:00 GMT" "2000-01-01 06:00:00 GMT"
[11] "2000-01-01 06:30:00 GMT" "2000-01-01 07:00:00 GMT"
[13] "2000-01-01 07:30:00 GMT" "2000-01-01 08:00:00 GMT"
[15] "2000-01-01 08:30:00 GMT" "2000-01-01 09:00:00 GMT"
[17] "2000-01-01 09:30:00 GMT" "2000-01-01 10:00:00 GMT"
[19] "2000-01-01 10:30:00 GMT" "2000-01-01 11:00:00 GMT"
[21] "2000-01-01 11:30:00 GMT" "2000-01-01 12:00:00 GMT"
[23] "2000-01-01 12:30:00 GMT" "2000-01-01 13:00:00 GMT"
[25] "2000-01-01 13:30:00 GMT" "2000-01-01 14:00:00 GMT"
[27] "2000-01-01 14:30:00 GMT" "2000-01-01 15:00:00 GMT"
[29] "2000-01-01 15:30:00 GMT" "2000-01-01 16:00:00 GMT"
[31] "2000-01-01 16:30:00 GMT" "2000-01-01 17:00:00 GMT"
[33] "2000-01-01 17:30:00 GMT" "2000-01-01 18:00:00 GMT"
[35] "2000-01-01 18:30:00 GMT" "2000-01-01 19:00:00 GMT"
[37] "2000-01-01 19:30:00 GMT" "2000-01-01 20:00:00 GMT"
[39] "2000-01-01 20:30:00 GMT" "2000-01-01 21:00:00 GMT"
[41] "2000-01-01 21:30:00 GMT" "2000-01-01 22:00:00 GMT"
[43] "2000-01-01 22:30:00 GMT" "2000-01-01 23:00:00 GMT"
[45] "2000-01-01 23:30:00 GMT" "2000-01-02 00:00:00 GMT"
[47] "2000-01-02 00:30:00 GMT" "2000-01-02 01:00:00 GMT"
[49] "2000-01-02 01:30:00 GMT" "2000-01-02 02:00:00 GMT"
[51] "2000-01-02 02:30:00 GMT" "2000-01-02 03:00:00 GMT"
[53] "2000-01-02 03:30:00 GMT" "2000-01-02 04:00:00 GMT"
[55] "2000-01-02 04:30:00 GMT" "2000-01-02 05:00:00 GMT"
[57] "2000-01-02 05:30:00 GMT" "2000-01-02 06:00:00 GMT"
[59] "2000-01-02 06:30:00 GMT" "2000-01-02 07:00:00 GMT"
[61] "2000-01-02 07:30:00 GMT" "2000-01-02 08:00:00 GMT"
[63] "2000-01-02 08:30:00 GMT" "2000-01-02 09:00:00 GMT"
[65] "2000-01-02 09:30:00 GMT" "2000-01-02 10:00:00 GMT"
[67] "2000-01-02 10:30:00 GMT" "2000-01-02 11:00:00 GMT"
[69] "2000-01-02 11:30:00 GMT" "2000-01-02 12:00:00 GMT"
[71] "2000-01-02 12:30:00 GMT" "2000-01-02 13:00:00 GMT"
[73] "2000-01-02 13:30:00 GMT" "2000-01-02 14:00:00 GMT"
[75] "2000-01-02 14:30:00 GMT" "2000-01-02 15:00:00 GMT"
[77] "2000-01-02 15:30:00 GMT" "2000-01-02 16:00:00 GMT"
[79] "2000-01-02 16:30:00 GMT" "2000-01-02 17:00:00 GMT"
[81] "2000-01-02 17:30:00 GMT" "2000-01-02 18:00:00 GMT"
[83] "2000-01-02 18:30:00 GMT" "2000-01-02 19:00:00 GMT"
[85] "2000-01-02 19:30:00 GMT" "2000-01-02 20:00:00 GMT"
[87] "2000-01-02 20:30:00 GMT" "2000-01-02 21:00:00 GMT"
[89] "2000-01-02 21:30:00 GMT" "2000-01-02 22:00:00 GMT"
[91] "2000-01-02 22:30:00 GMT" "2000-01-02 23:00:00 GMT"
[93] "2000-01-02 23:30:00 GMT" "2000-01-03 00:00:00 GMT"
[95] "2000-01-03 00:30:00 GMT" "2000-01-03 01:00:00 GMT"
[97] "2000-01-03 01:30:00 GMT" "2000-01-03 02:00:00 GMT"
[99] "2000-01-03 02:30:00 GMT" "2000-01-03 03:00:00 GMT"
## diferen?a entre cada hor?rio da sequ?ncia
head(diff(dhh))
Time differences in mins
[1] 30 30 30 30 30 30
## sequ?ncia de 6 horas
d6h <- seq(from = as.POSIXct("2000-01-01 01:30:00", tz = "GMT"),
to = as.POSIXct("2001-12-31 02:30:00", tz = "GMT"),
by = "6 hours")
head(d6h, 20)
[1] "2000-01-01 01:30:00 GMT" "2000-01-01 07:30:00 GMT"
[3] "2000-01-01 13:30:00 GMT" "2000-01-01 19:30:00 GMT"
[5] "2000-01-02 01:30:00 GMT" "2000-01-02 07:30:00 GMT"
[7] "2000-01-02 13:30:00 GMT" "2000-01-02 19:30:00 GMT"
[9] "2000-01-03 01:30:00 GMT" "2000-01-03 07:30:00 GMT"
[11] "2000-01-03 13:30:00 GMT" "2000-01-03 19:30:00 GMT"
[13] "2000-01-04 01:30:00 GMT" "2000-01-04 07:30:00 GMT"
[15] "2000-01-04 13:30:00 GMT" "2000-01-04 19:30:00 GMT"
[17] "2000-01-05 01:30:00 GMT" "2000-01-05 07:30:00 GMT"
[19] "2000-01-05 13:30:00 GMT" "2000-01-05 19:30:00 GMT"
## quantas pentadas por ano
table(format(d6h, "%H"))
01 07 13 19
731 730 730 730
Uma função muito útil na preparação de dados meteorológicos é a seleção partes do período de dados a partir de datas, anos, meses, dias ou horas. Vamos então explorar a função selectByDate
do pacote openair.
library(openair)
?selectByDate
# dados disponíveis com o openair
str(mydata)
'data.frame': 65533 obs. of 10 variables:
$ date: POSIXct, format: "1998-01-01 00:00:00" "1998-01-01 01:00:00" ...
$ ws : num 0.6 2.16 2.76 2.16 2.4 3 3 3 3.36 3.96 ...
$ wd : int 280 230 190 170 180 190 140 170 170 170 ...
$ nox : int 285 NA NA 493 468 264 171 195 137 113 ...
$ no2 : int 39 NA NA 52 78 42 38 51 42 39 ...
$ o3 : int 1 NA 3 3 2 0 0 0 1 2 ...
$ pm10: int 29 37 34 35 34 16 11 12 12 12 ...
$ so2 : num 4.72 NA 6.83 7.66 8.07 ...
$ co : num 3.37 NA 9.6 10.22 8.91 ...
$ pm25: int NA NA NA NA NA NA NA NA NA NA ...
# período de dados
range(mydata$date)
[1] "1998-01-01 00:00:00 GMT" "2005-06-23 12:00:00 GMT"
# visualização dos dados
timePlot(mydata, names(mydata)[-1])
# selecionando dados para um interval de datas
mydata_00 <- selectByDate(mydata, start = "2000-01-01", end = "2001-01-01")
head(mydata_00)
date ws wd nox no2 o3 pm10 so2 co pm25
17521 2000-01-01 00:00:00 1.68 200 203 41 1 41 6.55000 2.157500 NA
17522 2000-01-01 01:00:00 1.32 190 464 44 2 74 12.71667 7.196667 62
17523 2000-01-01 02:00:00 3.60 190 427 61 2 70 11.67333 6.406667 62
17524 2000-01-01 03:00:00 5.76 240 333 51 0 56 9.18250 3.880000 47
17525 2000-01-01 04:00:00 2.64 240 253 39 0 42 7.26000 2.852500 36
17526 2000-01-01 05:00:00 2.64 280 121 34 0 24 4.30750 1.617500 NA
tail(mydata_00)
date ws wd nox no2 o3 pm10 so2 co pm25
26323 2001-01-01 18:00:00 7.92 170 126 38 2 29 2.4500 1.6875 21
26324 2001-01-01 19:00:00 8.40 170 132 38 3 25 2.4500 2.0450 18
26325 2001-01-01 20:00:00 8.52 170 155 44 5 24 3.0375 1.9975 17
26326 2001-01-01 21:00:00 9.12 170 120 35 8 27 2.4750 1.8300 18
26327 2001-01-01 22:00:00 9.60 170 96 33 11 24 2.1200 1.3800 16
26328 2001-01-01 23:00:00 9.72 170 77 24 12 21 2.0275 1.2600 19
str(mydata_00)
'data.frame': 8808 obs. of 10 variables:
$ date: POSIXct, format: "2000-01-01 00:00:00" "2000-01-01 01:00:00" ...
$ ws : num 1.68 1.32 3.6 5.76 2.64 2.64 1.32 2.64 3.84 2.88 ...
$ wd : num 200 190 190 240 240 280 260 260 240 360 ...
$ nox : int 203 464 427 333 253 121 199 150 98 58 ...
$ no2 : int 41 44 61 51 39 34 35 36 35 30 ...
$ o3 : int 1 2 2 0 0 0 0 0 0 4 ...
$ pm10: int 41 74 70 56 42 24 26 24 19 14 ...
$ so2 : num 6.55 12.72 11.67 9.18 7.26 ...
$ co : num 2.16 7.2 6.41 3.88 2.85 ...
$ pm25: int NA 62 62 47 36 NA 22 19 16 11 ...
# selecionando todos janeiros
mydata_jan <- selectByDate(mydata, month = 1)
str(mydata_jan)
'data.frame': 5952 obs. of 10 variables:
$ date: POSIXct, format: "1998-01-01 00:00:00" "1998-01-01 01:00:00" ...
$ ws : num 0.6 2.16 2.76 2.16 2.4 3 3 3 3.36 3.96 ...
$ wd : num 280 230 190 170 180 190 140 170 170 170 ...
$ nox : int 285 NA NA 493 468 264 171 195 137 113 ...
$ no2 : int 39 NA NA 52 78 42 38 51 42 39 ...
$ o3 : int 1 NA 3 3 2 0 0 0 1 2 ...
$ pm10: int 29 37 34 35 34 16 11 12 12 12 ...
$ so2 : num 4.72 NA 6.83 7.66 8.07 ...
$ co : num 3.37 NA 9.6 10.22 8.91 ...
$ pm25: int NA NA NA NA NA NA NA NA NA NA ...
range(mydata_jan$date)
[1] "1998-01-01 00:00:00 GMT" "2005-01-31 23:00:00 GMT"
# selecionando de julho a agosto de 2000
mydata_jja <- selectByDate(mydata, month = 6:8, year = 2000)
head(mydata_jja)
date ws wd nox no2 o3 pm10 so2 co pm25
21169 2000-06-01 00:00:00 5.16 180 150 54 8 28 2.897500 1.0675000 23
21170 2000-06-01 01:00:00 4.92 180 102 38 13 22 1.556667 0.5566667 15
21171 2000-06-01 02:00:00 5.76 190 90 34 15 21 1.170000 0.3833333 12
21172 2000-06-01 03:00:00 6.36 220 93 29 10 20 0.875000 0.4700000 16
21173 2000-06-01 04:00:00 6.96 220 116 34 7 21 1.315000 0.3125000 13
21174 2000-06-01 05:00:00 7.32 210 190 35 4 31 2.920000 0.7300000 NA
tail(mydata_jja)
date ws wd nox no2 o3 pm10 so2 co pm25
23371 2000-08-31 18:00:00 6.12 180 371 87 5 61 11.6400 3.9550 46
23372 2000-08-31 19:00:00 5.52 180 401 98 5 65 11.4275 5.4575 49
23373 2000-08-31 20:00:00 6.00 170 345 64 5 60 10.3400 4.2675 46
23374 2000-08-31 21:00:00 6.72 180 226 64 6 47 5.5200 2.4275 38
23375 2000-08-31 22:00:00 6.36 180 215 55 4 33 4.9150 2.2575 23
23376 2000-08-31 23:00:00 5.64 190 180 50 6 28 4.0400 1.9850 NA
str(mydata_jja)
'data.frame': 2208 obs. of 10 variables:
$ date: POSIXct, format: "2000-06-01 00:00:00" "2000-06-01 01:00:00" ...
$ ws : num 5.16 4.92 5.76 6.36 6.96 7.32 6.96 8.04 8.04 8.16 ...
$ wd : num 180 180 190 220 220 210 200 210 210 200 ...
$ nox : int 150 102 90 93 116 190 376 430 429 273 ...
$ no2 : int 54 38 34 29 34 35 55 71 49 52 ...
$ o3 : int 8 13 15 10 7 4 3 2 2 1 ...
$ pm10: int 28 22 21 20 21 31 52 56 54 48 ...
$ so2 : num 2.897 1.557 1.17 0.875 1.315 ...
$ co : num 1.067 0.557 0.383 0.47 0.312 ...
$ pm25: int 23 15 12 16 13 NA 37 39 39 33 ...
timePlot(mydata_jja, names(mydata_jja)[-1])
Selecione dados dos meses maio e setembro somente às 0 6, 12, 18 horas.
library(lubridate)
ymd("20110604")
[1] "2011-06-04"
mdy("06-04-2011")
[1] "2011-06-04"
dmy("04/06/2011")
[1] "2011-06-04"
# Fuso horário
(hora_belem <- ymd_hms("2011-06-04 00:00:00", tz = "America/Belem"))
[1] "2011-06-04 BRT"
(hora_sp <- with_tz(hora_belem, "America/SaoPaulo"))
[1] "2011-06-04 03:00:00 America"
# extraindo informações
second(hora_sp)
[1] 0
hour(hora_sp)
[1] 3
day(hora_sp)
[1] 4
wday(hora_sp)
[1] 7
wday(hora_sp, label = TRUE)
[1] Sat
Levels: Sun < Mon < Tues < Wed < Thurs < Fri < Sat
yday(hora_sp)
[1] 155
month(hora_sp)
[1] 6
year(hora_sp)
[1] 2011
leap_year(2011)
[1] FALSE
# último dia do mês
last_day <- function(date) {
ceiling_date(date, "month") - days(1)
}
last_day(hora_sp)
[1] "2011-06-30 America"
Selecione dados dos de sábados no conjunto de dados
mydata
.