Comment trouver le plus haut (au plus tard) et la plus basse (la plus ancienne) date [R]
Je suis tenter de transformer deux colonnes dans mon dataframe de la "bonne" date & temps de classe, et jusqu'à maintenant n'ont pas beaucoup de succès avec elle. J'ai essayé différentes classes (timeDate
, Date
, timeSeries
, POSIXct
, POSIXlt
) mais sans succès. Peut-être que je suis juste donnant sur l'évidence et parce que j'ai essayé tellement de nombreuses approches, je ne sais pas ce qu'il en est plus. J'espère que certains d'entre vous peuvent jeter quelque lumière sur l'endroit où je vais mal.
Objectif:
Je veux calculer la différence entre deux dates à l'aide de la première et la dernière date. J'ai eu ce travail avec head()
et tail()
, mais parce que ces valeurs ne sont pas nécessaires, la première et la dernière date de mes données, j'ai besoin d'une autre façon. (Je ne peux pas obtenir le tri des données pour travailler, parce qu'il trie les données uniquement le jour de la date.)
Deuxième but: je veux convertir les dates de format quotidien (c'est à dire 8-12-2010) hebdomadaire, mensuelle, annuelle et les niveaux (i.e. '49-2010', 'décembre-10", et à seulement '2010'). Cela peut être fait avec les paramètres de format (comme %d-%m-%y
). Cela peut être fait avec de la conversion des données.cadre d'un temps de classe, et que la transformation de la timeclass dans le bon format (8-12-2010 -> format("%B-%y") -> 'december-10'
), puis la transformation de ce temps de classe dans un facteur de niveaux pour chaque mois?
Pour ces deux objectifs, j'ai besoin de convertir les dateframe d'une certaine façon à un temps de classe, et c'est là que j'ai rencontré quelques difficultés.
Mon dataframe ressemble à ceci:
> tradesList[c(1,10,11,20),14:15] -> tmpTimes4
> tmpTimes4
EntryTime ExitTime
1 01-03-07 10-04-07
10 29-10-07 02-11-07
11 13-04-07 14-05-07
20 18-12-07 20-02-08
Voici un résumé de ce que j'ai essayé:
> class(tmpTimes4)
[1] "data.frame"
> as.Date(head(tmpTimes4$EntryTimes, n=1), format="%d-%m-%y")
Error in as.Date.default(head(tmpTimes4$EntryTimes, n = 1), format = "%d-%m-%y") :
do not know how to convert 'head(tmpTimes4$EntryTimes, n = 1)' to class "Date"
> as.timeDate(tmpTimes4, format="%d-%m-%y")
Error in as.timeDate(tmpTimes4, format = "%d-%m-%y") :
unused argument(s) (format = "%d-%m-%y")
> timeSeries(tmpTimes4, format="%d-%m-%y")
Error in midnightStandard2(charvec, format) :
'charvec' has non-NA entries of different number of characters
> tmpEntryTimes4 <- timeSeries(tmpTimes4$EntryTime, format="%d-%m-%y")
> tmpExitTimes4 <- timeSeries(tmpTimes4$ExitTime, format="%d-%m-%y")
> tmpTimes5 <- cbind(tmpEntryTimes4,tmpExitTimes4)
> colnames(tmpTimes5) <- c("Entry","Exit")
> tmpTimes5
Entry Exit
[1,] 01-03-07 10-04-07
[2,] 29-10-07 02-11-07
[3,] 13-04-07 14-05-07
[4,] 18-12-07 20-02-08
> class(tmpTimes5)
[1] "timeSeries"
attr(,"package")
[1] "timeSeries"
> as.timeDate(tmpTimes5, format="%d-%m-%y")
Error in as.timeDate(tmpTimes5, format = "%d-%m-%y") :
unused argument(s) (format = "%d-%m-%y")
> as.Date(tmpTimes5, format="%d-%m-%y")
Error in as.Date.default(tmpTimes5, format = "%d-%m-%y") :
do not know how to convert 'tmpTimes5' to class "Date"
> format.POSIXlt(tmpTimes5, format="%d-%m-%y", usetz=FALSE)
Error in format.POSIXlt(tmpTimes5, format = "%d-%m-%y", usetz = FALSE) :
wrong class
> as.POSIXlt(tmpTimes5, format="%d-%m-%y", usetz=FALSE)
Error in as.POSIXlt.default(tmpTimes5, format = "%d-%m-%y", usetz = FALSE) :
do not know how to convert 'tmpTimes5' to class "POSIXlt"
> as.POSIXct(tmpTimes5, format="%d-%m-%y", usetz=FALSE)
Error in as.POSIXlt.default(x, tz, ...) :
do not know how to convert 'x' to class "POSIXlt"
La Heuredate paquets ont une fonction de "plage", toutefois, la conversion à la Date de la classe travaille pour une instance individuelle, mais pour une raison quelconque, pas pour un bloc de données:
> as.Date(tmpTimes4[1,1], format="%d-%m-%y")
[1] "2007-03-01"
> as.Date(tmpTimes4, format="%d-%m-%y")
Error in as.Date.default(tmpTimes4, format = "%d-%m-%y") :
do not know how to convert 'tmpTimes4' to class "Date"
À ce point, j'ai failli croire que c'est impossible de le faire, de sorte que toute pensée serait très appréciée!
Ce qui concerne,
- Vous pouvez utiliser
dput(tmpTimes4)
de fournir exacte dataset utiliser dans votre code. - Merci pour votre réponse! Je ne savais pas à propos de dput, donc merci pour l'astuce. 🙂
Vous devez vous connecter pour publier un commentaire.
Commencer avec quelques données factices:
nous avons donc quelque chose comme ceci:
À l'aide de la ci-dessus, regardez Objectif 1, calculer la différence entre la première et la dernière date. Vous pouvez traiter les dates, comme s'ils étaient des nombres (c'est la façon dont ils sont stockés à l'intérieur de toute façon), donc des fonctions comme
min()
etmax()
fonctionne. Vous pouvez utiliser ledifftime()
fonction:ou de l'utilisation standard de la soustraction
pour obtenir la différence en jours.
head()
ettail()
ne fonctionnera que si vous trier les dates que celles-ci prennent la première et la dernière valeur dans un vecteur, pas le plus haut et le plus bas de la valeur réelle.Objectif 2: Vous semblez être d'essayer de convertir un bloc de données à une Date. Vous ne pouvez pas faire cela. Ce que vous pouvez faire est de reformater les données dans le composants de la trame de données. Ici, j'ai ajouter des colonnes à
tmpTimes
en reformatant leEntryTime
colonne en plusieurs résumés de la date.Donner:
Si vous êtes Américain ou à utiliser l'US convention pour le début de la semaine (
%W
commence la semaine sur une lundi, en NOUS, de la convention est de commencer un dimanche), changer le%W
à%U
.?strftime
a plus de détails de ce que%W
et%U
représentent.Un dernier point sur format des données: ci-dessus, j'ai travaillé avec des dates dans la norme R format. Vous avez vos données stockées dans un bloc de données dans un non-standard de balisage, sans doute que des personnages ou des facteurs. Si vous avez quelque chose comme:
Vous avez besoin de convertir ces caractères ou des facteurs de quelque chose de R comprend comme une date. Ma préférence serait le
"Date"
classe. Avant d'essayer les réponses ci-dessus avec vos données, de convertir vos données dans le format correct:afin que vos données ressemble à ceci:
NA
dans un Date variable est une date non valide (c'est à dire le format est incorrect, ou à une date qui n'existe pas). Je ne pense pas ignorer que c'est une bonne chose et vous devez enquêter sur le pourquoi de laNA
s sont là. Si elles sont là parce que vous n'avez pas d'enregistrer la date, se débarrasser d'eux; si vous ne connaissez pas la date de la données est inutile.Réponse courte:
Ensuite utiliser min et max sur la liste
de dates.