Umbenennen von Spaltenname in Datumswerte
Verfasst von Zuralein am 15 Februar, 2010 - 21:00
Hallo zusammen,
ist es möglich, auf einfache Weise die Spaltennamen umzubenennen in Datumswerte?
Konkret habe ich die Spaltennamen
t0 t1 t2 ... t120
Diese Namen sollen durch Monatsultimo-Werte ersetzt werden, so dass dasteht:
31.01.2010 28.02.2010 31.03.2010 .... 31.01.2020
Eine umständliche Lösung mit 120 Zeilen hab ich gefunden. Die Frage ist, ob das irgendwie eleganter geht, z.B. mittels einer Schleife?
Vielen Dank schonmal vorab & Grüße
Zura
»
- Anmelden oder Registrieren um Kommentare zu schreiben

Label ist ein deklaratives Statement
Hallo Zura,
die von Dir gewünschten Namen sind keine gültigen Namen. Man kann zwar SAS anweisen, auch solche Namen zu akzeptieren, es wird aber nicht empfohlen. Stattdessen kann man aber den Variablen eine Etikette (Label) verpassen. Im Code werden Sie aber immer noch unter den ursprünglichen Namen angesprochen.
Das Labelstatement ist ein deklaratives Statement, d. h., dass zur Kompilierungszeit die Namen schon feststehen müssen und man sie nicht zur Laufzeit zuweisen kann. Als Ausweg bleibt da nur ein Makro zu schreiben, da Makros schon zur Kompilierungszeit ausgewertet werden.
Das Datum bilde ich mit der Funktion MDY, und zwar den ersten des nachfolgenden Monats. Um immer den letzten Tag eines Monats zu bekommen, habe ich in der Funktion PUTN vom dem Datum einen Tag abgezogen. Dann muss ich nur für den Dezember eine Extrabehandlung durchführen und kann da gleich den 31.12 zuweisen. Die Funktion PUTN ist auch für die Formatierung zuständig.
%DO I = 1 %TO &ANZJAHR.;
%DO J = 1 %TO 11;
%LET Datum = %SYSFUNC(PUTN(%SYSFUNC(MDY(&J. + 1, 1, &BASISJAHR. + &I. - 1)) -1,DDMMYYP10.));
%LET Index = %EVAL(((&I. - 1) * 12) + &J.);
LABEL &PREFIX.&INDEX. = "&DATUM.";
%IF &J. = 11 %THEN %DO;
%LET Datum = %SYSFUNC(PUTN(%SYSFUNC(MDY(12, 31, &BASISJAHR. + &I. - 1)),DDMMYYP10.));
%LET Index = %EVAL(((&I. - 1) * 12) + 12);
LABEL &PREFIX.&INDEX. = "&DATUM.";
%END;
%END;
%END;
%mend;
option mprint;
data test;
%labeln(T,2010,10);
format t1-t120 ddmmyyP10.;
array Monate {10,12] t1 - t120;
do i = 1 to 10;
do j=1 to 11;
Monate[i,j] = MDY(J + 1, 1, 2010 + i -1) - 1;
if j = 11 then Monate[i,12] = MDY(12, 31, 2010 + i -1);
end;
end;
run;
Schöne Grüße
Jan
Oh Gott
Hallo Jan,
erstmal vielen Dank für deine Mühe.
Vielleicht lässt sich das Problem einfacher lösen, nachdem ich einen nächsten Verarbeitungsschritt ausgeführt habe. Die Tabelle wurde transponiert und hat nun folgende Gestalt:
SpalteA Volumen
t0 100
t1 80
t2 60
... ...
t120 0
t0 200
t1 180
... ...
t120 0
... ...
Ansonsten gleiches Problem wie vorher:
Statt t0 soll 31.1.2010
Statt t1 soll 28.2.2010
etc.dastehen (also immer 1Monat weiter).
Wie kann ich das mittels einer schönen Schleife (anstelle einer langen umständlichen Umbenennungsaktion) lösen?
Vielen Dank schonmal vorab & Grüße
Zura
INTNX
Hallo Zura.
Ich halte eine Schleife hier für überflüssig, wenn Du die Daten transponieren kannst. Mit INTNX kannst Du eine neue Variable erzeugen, die die gewünschten Werte enthält.
input ts $ vol;
datalines;
t0 100
t1 80
t2 60
t3 120
t0 34
t1 435
t2 3424
;
data redscope_ren;
retain monat "31DEC2009"d;
set redscope;
if ts = 't0' then monat = "31DEC2009"d;
monat = intnx('month', monat, 1, 'end');
format monat ddmmyyp10.;
run;
HTH
Dubravko Dolic
Sensationell
Hvala!
drago mi je
Dubravko