2013-09-28 4 views
2

J'ai une liste des prix intra-jour à 9 heures, 10 heures, 11 heures, etc. pour chaque jour (qui sont dans des formats numériques tels que 15011 15012, etc.)données SAS retour des 5 derniers jours disponibles

I ne souhaite conserver que les observations des 5 derniers jours disponibles et des 5 prochains jours disponibles à partir de la date 't' et supprimer tout le reste. Existe-t-il un moyen de le faire?

J'ai essayé d'utiliser si la date < & t - 5 ou date> & t + 5 puis supprimer; Cependant, comme il y a des week-ends/vacances, je ne reçois pas toutes les observations que je veux.

Merci beaucoup d'avance!

+0

S'il vous plaît un peu de code pour reproduire votre problème. –

Répondre

1

Pas beaucoup d'informations pour aller plus loin, mais voici une solution:

/* Invent some data */ 
data have; 
    do date=15001 to 15020; 
    do time='09:00't,'10:00't,'11:00't; 
     price = ranuni(0) * 10; 
     output; 
     end; 
    end; 
run; 

/* Your macro variable identifying the target "date" */ 
%let t=15011; 

/* Subset for current and following datae*/ 
proc sort data=have out=temp(where=(date >= &t)); 
    by date; 
run; 

/* Process to keep only current and following five days */ 
data current_and_next5; 
    set temp; 
     by date; 
    if first.date then keep_days + 1; /* Set counter for each day */ 
    if keep_days <= 6;     /* Days to keep (target and next five) */ 
    drop keep_days;     /* Drop this utility variable */ 
run; 

/* Subset for previous and sort by date descending */ 
proc sort data=have out=temp(where=(date < &t)); 
    by descending date; 
run; 

/* Process to keep only five previous days */ 
data prev5; 
    set temp; 
     by descending date; 
    if first.date then keep_days + 1; /* Set counter for each day */ 
    if keep_days <= 5;     /* Number of days to keep */ 
    drop keep_days;     /* Drop this utility variable */ 
run; 

/* Concatenate together and re-sort by date */ 

data want; 
    set current_and_next5 
     prev5; 
run; 

proc sort data=want; 
    by date; 
run; 

Bien sûr, cette solution suggère que vos données de départ contient des observations pour tous les « jours de bourse » valides et renvoie tout sans faire jour arithmétique. Une solution beaucoup mieux exigerait que vous créiez un ensemble de données «calendrier commercial» avec toutes les dates valides. Vous pouvez facilement gérer les week-ends, mais les jours fériés et les autres «jours sans négociation» sont très spécifiques au site; donc utiliser un calendrier est presque toujours préféré. MISE À JOUR: Le commentaire de Joe m'a fait relire la question plus attentivement. Cela devrait renvoyer un total de onze (11) jours de données; cinq jours avant, cinq jours suivant et la date cible. Mais encore, une meilleure solution utiliserait une table de référence de calendrier.

+1

Cela manque les «5 derniers jours disponibles», malheureusement. Je suppose que vous pourriez inverser le tri pour les ramasser. – Joe

+0

Au lieu d'une date fixe, pouvons-nous utiliser proc sql pour sélectionner une date dans la table en fonction de certaines conditions, comme si prix = XX, choisissez cette date. '/ * Votre variable macro identifiant la" date "cible */ % let t = 15011;' – ZeekDSA

0

Essayez cette

/* Get distinct dates before and after &T */ 
proc freq data=mydata noprint ; 
    table Date /out=before (where=(Date < &T)) ; 
    table Date /out=after (where=(Date > &T)) ; 
run ; 

/* Take 5 days before and after */ 
proc sql outobs=5 ; 
    create table before2 as 
    select Date 
    from before 
    order by Date descending ; 

    create table after2 as 
    select Date 
    from after 
    order by Date ; 
quit ; 

/* Subset to 5 available days before & after */ 
proc sql ; 
    create table final as 
    select * 
    from mydata 
    where Date >= (select min(date) from before2) 
    and Date <= (select max(date) from after2) 
    order by Date ; 
quit ; 
Questions connexes