Vamos converter datas em excel para o formato nativo do R:
excel.dates <- c("27/02/2004", "27/02/2005", "14/01/2003", "28/06/2005", "01/01/1999")
excel.dates
## [1] "27/02/2004" "27/02/2005" "14/01/2003" "28/06/2005" "01/01/1999"
Para transformar em datas R, escrevemos:
date <- strptime(excel.dates, format = "%d/%m/%Y")
date
## [1] "2004-02-27 -03" "2005-02-27 -03" "2003-01-14 -03" "2005-06-28 -03"
## [5] "1999-01-01 -03"
Observe que o Y ficou em maiúsculo, é para diferenciar 1905 de 2005, se fosse o século anterior, usava-se o y minúsculo.
Outro exemplo, mas com anos em dois dígitos (%y) e os meses como nomes abreviados (%b) e sem separadores:
outras.datas <- c("1jan99", "2jan05", "31mar04", "30jul05")
outras.datas
## [1] "1jan99" "2jan05" "31mar04" "30jul05"
strptime(outras.datas, "%d%b%y")
## [1] "1999-01-01 -03" "2005-01-02 -03" "2004-03-31 -03" "2005-07-30 -03"
você geralmente desejará criar objetos POSIXlt a partir de componentes armazenados em vetores dentro de dataframes. por exemplo, aqui está um dataframe com as horas, minutos e segundos de um experimento com dois níveis de fator em colunas separadas.
times <- read.table("times.txt", header = T)
times
## hrs min sec experiment
## 1 2 23 6 A
## 2 3 16 17 A
## 3 3 2 56 A
## 4 2 45 0 A
## 5 3 4 42 A
## 6 2 56 25 A
## 7 3 12 28 A
## 8 1 57 12 A
## 9 2 22 22 B
## 10 1 42 7 B
## 11 2 31 17 B
## 12 3 15 16 B
## 13 2 28 4 B
## 14 1 55 34 B
## 15 2 17 7 B
## 16 1 48 48 B
attach(times)
Porque “times” não está no formato POSIXlt você precisa colar juntos a hora, minutos e segundos em uma única string separados por dois pontos:
paste(hrs,min,sec,sep = ":")
## [1] "2:23:6" "3:16:17" "3:2:56" "2:45:0" "3:4:42" "2:56:25" "3:12:28"
## [8] "1:57:12" "2:22:22" "1:42:7" "2:31:17" "3:15:16" "2:28:4" "1:55:34"
## [15] "2:17:7" "1:48:48"
Agora, salve este objeto como um vetor difftime chamado duration:
duration <- as.difftime(paste(hrs,min,sec,sep = ":"))
Então você pode realizar cálculos como média e variância usando a função tapply
tapply(duration,experiment,mean)
## A B
## 2.829375 2.292882
Uma ação comum com dados de tempo é computar a diferença de tempo entre sucessivas linhas de um dataframe. O vetor chamado duration criado acima é da classe difftime e contém 16 tempos medidos em horas decimais.
class(duration)
## [1] "difftime"
duration
## Time differences in hours
## [1] 2.385000 3.271389 3.048889 2.750000 3.078333 2.940278 3.207778 1.953333
## [9] 2.372778 1.701944 2.521389 3.254444 2.467778 1.926111 2.285278 1.813333
Nós podemos computar diferenças entre linhas sucessivas usando subscripts, como estes:
duration[1:15]-duration[2:16]
## Time differences in hours
## [1] -0.8863889 0.2225000 0.2988889 -0.3283333 0.1380556 -0.2675000
## [7] 1.2544444 -0.4194444 0.6708333 -0.8194444 -0.7330556 0.7866667
## [13] 0.5416667 -0.3591667 0.4719444
Você pode querer fazer as diferenças entre linhas sucessivas em parte do quadro de dados (por exemplo, relacionar a mudança no tempo a uma das variáveis explicativas no quadro de dados). Antes de fazer isso, é necessário decidir a linha na qual colocar o primeira das diferenças. A alteração no tempo entre as linhas 1 e 2 está relacionada às variáveis explicativas na linha 1 ou linha2? suponha que seja a linha 1 que queremos conter a primeira diferença de tempo (-0,886), porque estamos trabalhando com diferenças, o vetor de diferenças é menor em um do que o vetor do qual foi calculado.
length(duration[1:15]-duration[2:16])
## [1] 15
length(duration)
## [1] 16
Então, nós precisamos adicionar um NA ao final do fetor (na linha 16):
diffs <- c(duration[1:15]-duration[2:16],"NA")
diffs
## Time differences in hours
## [1] -0.8863889 0.2225000 0.2988889 -0.3283333 0.1380556 -0.2675000
## [7] 1.2544444 -0.4194444 0.6708333 -0.8194444 -0.7330556 0.7866667
## [13] 0.5416667 -0.3591667 0.4719444 NA
Agora, nós podemos fazer este novo vetor como parte do dataframe times:
times$diffs <- diffs
times
## hrs min sec experiment diffs
## 1 2 23 6 A -0.8863889 hours
## 2 3 16 17 A 0.2225000 hours
## 3 3 2 56 A 0.2988889 hours
## 4 2 45 0 A -0.3283333 hours
## 5 3 4 42 A 0.1380556 hours
## 6 2 56 25 A -0.2675000 hours
## 7 3 12 28 A 1.2544444 hours
## 8 1 57 12 A -0.4194444 hours
## 9 2 22 22 B 0.6708333 hours
## 10 1 42 7 B -0.8194444 hours
## 11 2 31 17 B -0.7330556 hours
## 12 3 15 16 B 0.7866667 hours
## 13 2 28 4 B 0.5416667 hours
## 14 1 55 34 B -0.3591667 hours
## 15 2 17 7 B 0.4719444 hours
## 16 1 48 48 B NA hours
dolar <- read.csv("dolj2002mar.csv", sep = ";", header = T)
head(dolar)
## hora Valor lote agr vr
## 1 09:00:37 4.508,00 -5 UBS i
## 2 09:00:37 4.507,50 -5 UBS d
## 3 09:00:38 4.508,00 -5 Ideal s
## 4 09:00:38 4.507,50 -5 UBS d
## 5 09:00:38 4.508,50 -5 Ideal s
## 6 09:00:38 4.507,50 -5 Ideal d
attach(dolar)
duracao <- as.difftime(paste(hora))
class(duracao)
## [1] "difftime"
length(duracao)
## [1] 46593
difer <- c(duracao[1:46093]-duracao[501:46593])
head(difer)
## Time differences in hours
## [1] -0.01055556 -0.01055556 -0.01027778 -0.01027778 -0.01027778 -0.01027778
length
## function (x) .Primitive("length")