Créer une date de trois manières

Créer une date de trois manières

By : -

Créer une date de trois manières

 

Le langage SAS utilise sa propre échelle de temps. Tout d’accord, faisons un rappel sur les notions de date, heure et de la combinaison date et heure. Puis, voyons trois alternatives pour convertir ou créer ces valeurs.

1. Rappel sur la notion de date SAS et datetime SAS

Date : Une date SAS est un nombre entier égal au nombre de jours écoulés depuis le 1er janvier 1960. Les dates avant 1960 sont donc négatives. Le 1er janvier 1960 est égal à zéro. Ainsi la différence entre deux dates SAS est un nombre de jours.

Time : Un time SAS est un nombre représentant le nombre de secondes écoulées depuis minuit. Il varie entre 0 et 86400 (60 secondes * 60 minutes *24 heures). La différence entre deux times SAS est un nombre de secondes.

Datetime : Un datetime SAS est un nombre représentant le nombre de secondes écoulées depuis le 1er janvier 1960. Ce nombre aura une valeur décimale si on utilise des dixièmes de secondes. Mais ceci est rare. La différence entre deux datetimes SAS est donc un nombre de secondes.

Les variables contenant des valeurs date, time ou datetime sont des variables numériques.

Avantages : Ces nombres facilitent des calculs sur le temps écoulé. De plus, les fonctions de temps SAS ont besoin de ces valeurs. Par exemple, la fonction month extrait le mois d’une date SAS.

Inconvénient et parade : pour lire ces date/time/datetime, on préfère les voir en langage humain. Soit un format est appliqué sur la valeur numérique, soit une variable caractère est créée avec une fonction put et le nom du format. Ce sujet ne sera pas détaillé dans cet article.

2. La différence avec Excel

Date : alors que le 1er janvier 1960 correspond à la date SAS zéro, le 1er janvier 1900 correspond à la date Excel un (et non zéro). Pour passer d’une date Excel à une date SAS, ajoutez 21916.

sas_date = excel_date * 21916;

Time : là encore, il y a une différence avec Excel. Une heure Excel est un nombre compris entre 0 et 1. Une heure SAS est un nombre compris entre 0 et 86400 c’est-à-dire 60 secondes x 60 minutes x 24 heures. Midi est équivalent à 0.5 avec Excel (une demi journée) alors qu’il est égal à 60 (secondes) x 60 (minutes) x 12 (heures), soit 43200 secondes (SAS time). Pour passer d’une heure Excel à une heure SAS, il suffit de multiplier l’heure Excel par 86400 (secondes).

sas_time = excel_time * 86400;

Il n’y a pas de valeurs négatives avec Excel. Au delà d’une journée on perd l’information sur le nombre de jours : 16h+10h=2h du matin avec Excel, alors qu’en langage SAS cela équivaut à 26h (60x60x26).

Datetime : maintenant, combinons les deux solutions pour convertir une valeur datetime d’Excel en datetime SAS.

sas_date_time = (excel_date_time - 21916 ) * 86400;

3. Créer une date/time/datetime avec les fonctions MDY, HMS et DHMS

Créer une date avec la fonction MDY : La fonction MDY crée une date SAS. Elle a besoin de trois valeurs numériques : le mois, le jour et l’année. Aux Etats-Unis, le mois apparaît en premier dans la date, suivi du jour et enfin du mois. Le langage SAS ayant été développé aux  Etats-Unis, l’ordre des paramètres de la fonction MDY commence aussi par le mois. Le nom de la fonction est lui-même parlant : M pour month, D pour day et Y pour year.

visit_dt = mdy(visit_m,visit_d,visit_y);

Créer un time avec la fonction HMS : la fonction HMS retourne un time SAS. Elle est composée des heures, des minutes et des secondes.

visit_hour = hms(vist_hr,visit_min,visit_sec);

Créer un datetime avec la fonction DHMS :  la fonction DHMS a 4 paramètres : la date SAS, le nombre d’heures, le nombre de minutes et le nombre de secondes.

visit_time = dhms(visit_dt, vist_hr,visit_min,visit_sec);

4. Créer une date/time/datetime avec la fonction input et un informat

On peut lire une valeur texte et demander à SAS de l’interpréter comme une date. Il faut alors que ce texte suive une des structures répertoriées dans un informat. SAS® Institute propose dans sa documentation en ligne la liste des informas par catégorie : “SAS Online Doc., Informats by Category”. La fonction INPUT est alors utilisée. Le premier paramètre est soit une valeur texte entre guillemets, soit une variable texte.

DATE informat : Une des notations les plus utilisées pour lire des dates est le jour suivi des trois premières lettres du mois en anglais et enfin de l’année exprimée avec 4 chiffres. La longueur totale étant de 9 caractères, l’informat s’appelle date9.

jour = input('25NOV1952',date9.);

DATE. a pour valeur par défaut 7 (date7.) qui donne une année à 2 chiffres. Attention à l’option globale YEARCUTOFF qui décidera s’il s’agit de 1952 ou 2052 par exemple. Voir la section 5 pour plus de détails sur cette option.

nov_dt = input('25NOV52',date7.);

TIME informat : L’informat time. a pour longueur par défaut 8. Donc time. et time8. sont identiques. Par soucis de clarifier je préfère ajouter le nombre.

heure = input('08:15:00',time8.);

Si vous n’avez pas de secondes, vous pouvez donc utiliser time5.

heure = input('12:15',time5.);

DATETIME informat : L’informat datetime. a pour longueur par défaut 18. Ainsi datetime. et datetime18. sont identiques.

jour_heure = input('25NOV1952:08:15:10',datetime18.);

5. L’option yearcutoff

Identifier la valeur actuelle de yearcutoff : pour savoir quelle est l’année de yearcutoff, consultez la log après avoir soumis le code suivant :

proc options;
run;

Changer le yearcutoff : pour changer cette valeur, utilisez l’instruction globale options et le mot-clé yearcutoff.

options yearcutoff=1950;

Interprétation : Si yearcutoff = 1920, alors :

  • Une année inférieure à 20 sera interprétée comme égale à une année 2000 :  20xx.
  • Une année supérieure ou égale à 20 sera interprétée comme une année 1900 : 19xx

6. Ecrire manuellement quelques valeurs date/time/datetime

Une manière rapide de créer une date SAS si, et seulement si, on a très peu de valeurs à entrer est de faire suivre la valeur texte de d, t ou dt selon qu’il s’agisse d’une date, d’un time ou d’un datetime.

x_date     = '25NOV1952'd;
x_time     = '08:15:00't;
x_datetime = '25NOV1952:08:15:10'dt;

 

One Comment

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

5 × trois =