2017-08-08 2 views
-2

J'ai une trame de données avec colonne année exerciceConvertir AAAA-AA à l'autre (date)

Year 
2001-02 
2002-03 
2003-04 

Comment puis-je convertir en as.Date garder soit la chose ou tout simplement la deuxième année à savoir 2002,2003,2004. Sur la conversion avec %Y, je reçois inévitablement 2001-08-08, 2002-08-08, 2003-08-08 etc.

Merci

+2

Pourquoi ne pas utiliser simplement 'sous (« -. * » , '', Year) 'pour la première année ou' paste0 ('20 ', sub ('. * - ',' ',' 2001-02 ')) 'pour la seconde – Sotos

+0

' sub ("^ (..) ..- (..) $ "," \\ 1 \\ 2 "," 2001-02 ")' pour la deuxième année. – lmo

+1

N'utilisez simplement pas d'expressions régulières pour les dates. Ils n'attraperont jamais les choses "le 31 avril". Seuls les analyseurs de date font, et nous en avons beaucoup. Utilisez-les et recommandez leur utilisation. –

Répondre

1
library(lubridate) 

Year <- c('2001-02', '2002-03', '2003-04') 

year(as.Date(gsub('[0-9]{2}-', '', Year), format = '%Y')) 
+0

La chaîne de la dernière colonne est numérique. Je cherche le format de date AAAA ou AAAA-AA. –

+0

Une date comprendra toujours le mois et le jour. Si vous voulez seulement l'année, vous devez l'extraire comme un nombre ou un vecteur de caractères. C'est ce que fait 'lubridate' de' year', ou vous pouvez simplement l'obtenir en utilisant 'format'. AFAIK, vous ne serez pas en mesure d'obtenir juste l'année et le garder dans le type de date. –

0

1) ISODate la question de clarification, car il renvoie à la fin de l'année et à la date à laquelle nous supposons que l'entrée correspond à l'année fiscale indiquée dans la question (plus nous avons ajouté le cas marginal «1999-00») ainsi qu'au mois et au jour de la fin de l'année. Nous supposons que la sortie désirée est la fin de l'année en tant qu'objet Date. (Si ce n'est pas la question voulue et que vous voulez juste l'année fiscale en fin de mois, voir Note à la fin.)

Pour revenir au problème supposé, supposons, par exemple, que 31 mars est la fin de l'année. Ci-dessous nous extrayons le premier 4 caractères de Year en utilisant substring, convertissons cela en numérique et ajoutons 1. Puis nous passons cela avec le mois et le jour à ISODate et finalement le convertir en Date. Aucune expression régulière ou package n'est utilisé.

# test inputs 

month <- 3 
day <- 31 
Year <- c("1999-00", "2001-02", "2002-03", "2003-04") 

# yearends 

as.Date(ISOdate(as.numeric(substring(Year, 1, 4))+1, month, day)) 
## [1] "2000-03-31" "2002-03-31" "2003-03-31" "2004-03-31" 

manipulation de chaînes 2) Une solution alternative en utilisant les mêmes entrées est le suivant. Il est similaire sauf que nous utilisons sub avec une expression régulière qui correspond au moins et deux caractères suivants en substituant une chaîne de longueur zéro pour eux, convertit en numérique et ajoute 1. Ensuite, il met en forme une chaîne dans un format acceptable à as.Date en utilisant sprintf et s'applique enfin as.Date. Aucun paquet n'est utilisé.

as.Date(sprintf("%d-%d-%d", as.numeric(sub("-..", "", Year))+1, month, day)) 
## [1] "2000-03-31" "2002-03-31" "2003-03-31" "2004-03-31" 

Note: Si vous ne vouliez l'année de fin d'année fiscale en nombre alors il serait juste ceci:

as.numeric(substring(Year, 1, 4)) + 1