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

Calculando diferença de tempo entre linhas de um dataframe:

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")