Antworte auf:  SAS: Zeitraum auf Monate verteilen von mrdjv2
Forum:  Programmieren, moderiert von: matph

[Zur Forum-Gliederung] [Wie man Fragen beantwortet] [Themenstart einblenden]

  Alle registrierten Mitglieder können Mitteilungen schreiben.
Benutzername:
Passwort:
Nachricht-Icon:                   
                  
              
Nachricht:


 
 


Input assistance tools (JavaScript): [Link extern intern] [MathML?] [$$?]
[fed-area] [LaTeX-inline] [LaTeX-display] [Tikz] [hide-area][show-area] [Source code [num.]][?]
 Show Preview      Write using fedgeo formula editor or Latex.

Smilies for your message:
😃 😄 😁 🙂 🙃 😉 🤗 🤫 🤔 🙄 😴 🤒 😎 😮 😲 😂
🙁 😖 😒 😐 😡 👌 👍 👎 🤢 🤧 🥵 🥶 😵 🤯 😛 😷
Optionen: Deaktiviere HTML in dieser Nachricht
Deaktiviere MATHML in dieser Nachricht. Wenn Dein Text $-Zeichen enthält, die nicht LaTeX-Formeln begrenzen.
Deaktiviere Smilies in dieser Nachricht
Zeige die Signatur (Kann in 'Mein Profil' editiert werden.)
    [Abbrechen]
 
Beachte bitte die [Forumregeln]


Themenübersicht
mrdjv2
Aktiv
Dabei seit: 05.07.2003
Mitteilungen: 1001
Wohnort: Aachen

 Beitrag No.9, eingetragen 2021-04-10 22:10    [Diesen Beitrag zitieren]

Also, meine Holzhammermethode funktioniert!
Das Macro oben nicht nicht ganz fehlerfrei, aber es geht mir um die Idee, wie ich "dynamisch" eine Variable befülle...

Aber wie schonmal gesagt...mach dir keinen Stress! ;-)


cramilu
Aktiv
Dabei seit: 09.06.2019
Mitteilungen: 966
Wohnort: Schwäbischer Wald, seit 1989 freiwilliges Exil in Bierfranken

 Beitrag No.8, eingetragen 2021-04-10 21:57    [Diesen Beitrag zitieren]

Dein Makro hattest Du gepostet, während ich noch
am Tippen meines Beitrags war.
Werd' ich mir anschauen, komme dann aber heute wohl
nicht mehr zu weiterem...
So viel zu tun - und zu wenig Zeit!


mrdjv2
Aktiv
Dabei seit: 05.07.2003
Mitteilungen: 1001
Wohnort: Aachen

 Beitrag No.7, eingetragen 2021-04-10 20:56    [Diesen Beitrag zitieren]

Ich glaube, das geht schon in die richtige Richtung...
Aber ist mein Macro von oben da nicht schon die richtige Lösung?


cramilu
Aktiv
Dabei seit: 09.06.2019
Mitteilungen: 966
Wohnort: Schwäbischer Wald, seit 1989 freiwilliges Exil in Bierfranken

 Beitrag No.6, eingetragen 2021-04-10 20:53    [Diesen Beitrag zitieren]

Hallöle!

Ergo: Ein Zeitraum von stets höchstens grob 36 Monaten
bildet den Rahmen? Darin gibt es "Beäugungszeiträumchen"
von höchstens 3 bis 4 Monaten, oder geht es bei Bedarf
um den Gesamtzeitraum?
Mein erster Tipp:
Feldvariable   aMonths := {{"Januar",31}, ... , {"Dezember",31}}
mit Monatsnamen und Tagen. Schaltjahrproblematik später.
Anhand der Monatsnummer des Startdatums ins Feld springen.
Tage für jenen Monat:
iDays#1 := aMonths[month(earlier_date),2] - day(earlier_date) + 1
... Ausgabe für ersten Monat [plus Schaltjahrcheck]
DO-WHILE-Schleife für die Ausgabe der Monate bis zum vorletzten.
Danach Ausgabe für den letzten Monat...
Innerhalb der Schleife wird die anfängliche Monatszahl
hochgezählt, bei Überlauf über 12 ggf. wieder auf 1 gesetzt...
... Jahreszahl mit hochzählen... Schaltjahrchecks...
Bin ich da thematisch noch "auf dem richtigen Dampfer"?
So oder so ist das bloß ein erster grober "Hüftschuss" ;)

[Die Antwort wurde nach Beitrag No.4 begonnen.]


mrdjv2
Aktiv
Dabei seit: 05.07.2003
Mitteilungen: 1001
Wohnort: Aachen

 Beitrag No.5, eingetragen 2021-04-10 20:45    [Diesen Beitrag zitieren]

Ich hab noch ein bisschen herumgespielt und glaube, ich habe eine halbwegs elegante Lösung gefunden, die aber noch einen Fehler hat, den ich nicht verstehe:
SAS
	%macro tage_je_monat(monatserster, monatsletzter, tage, variable);
 
			%if uda < &monatserster. and rda > &monatsletzter. %then &variable. = &tage.;
			%if uda > "31Jan2017"d %then &variable. = 0;
			%if uda ge &monatserster. and rda le &monatsletzter. %then &variable. = RENTAL_DAYS;
			%if uda < &monatserster. and rda le &monatsletzter. %then &variable. = day(rda);
			%if uda > &monatserster. and uda le &monatsletzter. rda > &monatsletzter. %then &variable. = &tage.-day(uda)+1;
 
	%mend
 

UDA und RDA sind die oben erwähnten Zeitpunkte.
Das Macro würde ich z.B. so aufrufen:

%tage_je_monat("01.02.2017"d, "28.02.2017"d, 28, X_2017_Feb);

Leider schreibt er in X_2017_Feb gar keinen Inhalt. Muss ich dem Macor noch irgendwie mitgeben, dass X_2017_Feb eine globale Variable ist?



mrdjv2
Aktiv
Dabei seit: 05.07.2003
Mitteilungen: 1001
Wohnort: Aachen

 Beitrag No.4, eingetragen 2021-04-10 20:14    [Diesen Beitrag zitieren]

Servus ;-)

Also vorweg zur Frage, ob es pressiert: Joa, ein bisschen, aber nicht so sehr, dass du dir das Wochenende um die Ohren schlagen sollst...
Ich werde erstmal die Holzhammermethode implementieren. Die müsste eigentlich funktionieren, aber ist eben nicht so elegant.

Die 36 Monate sind im Moment fix. Es ist Januar 2017 bis Dezember 2019.
Im Mittelalter sind wir nicht mehr so unterwegs ;-)


cramilu
Aktiv
Dabei seit: 09.06.2019
Mitteilungen: 966
Wohnort: Schwäbischer Wald, seit 1989 freiwilliges Exil in Bierfranken

 Beitrag No.3, eingetragen 2021-04-10 18:17    [Diesen Beitrag zitieren]

Hallo ;)

"Die Variante, einen Zeitraum in ein Datenfeld zu packen,
kannte ich gar nicht."

Och... meine Kunden kriegen über die Jahre immer wieder
die ärgsten Verstöße gegen Normalisierungsgebote hin. 🙄

SAS scheint grundlegend mit SQL verwandt!?

Bei "bloß" ein "paar Millionen Datensätzen" wäre die Dauer
für eine Einzelberechnung nun wohl auch nicht mehr
"kriegsentscheidend", oder!?
Ich würde dann, wenn ich es schon algorithmisch angehe,
das Ding gleich so programmieren, dass es für alle Zeiträume
nach 1583 und gregorianischen Kalender funzt...
Sind es insgesamt veränderliche 36 Monate?
Ich mag zunächst noch ein wenig in die SAS-Syntax spicken...
Pressierts?


mrdjv2
Aktiv
Dabei seit: 05.07.2003
Mitteilungen: 1001
Wohnort: Aachen

 Beitrag No.2, eingetragen 2021-04-10 16:07    [Diesen Beitrag zitieren]

Ich habe ein Beginndatum in einer Variablen und ein Enddatum in einer zweiten Variablen. Es sind beides Datumsformate, wobei das ja zweitrangig ist, da man Strings ja ggf. auch in ein Datum konvertieren kann.

Die Variante, einen Zeitraum in ein Datenfeld zu packen, kannte ich gar nicht.

Was ich mir bis jetzt überlegt habe, war, für jeden Monat eine Fallunterscheidung zu machen:

1.) Zeitraum überdeckt Monat => 30 Tage (oder wie viele Tage der jew. Monat hat)
2.) Zeitraum ist komplett außerhalb dieses Monats => 0 Tage
3.) Zeitraum ist komplett innerhalb des Monats => Datumsdifferenz
4.) Zeitraum ragt in einen Monat hinein => Tage zählen

Da ich insgesamt 36 Monate habe, die ich betrachten muss, hoffe ich auf eine elegante Lösung, wie das einfach zu bewerkstelligen ist.

Ansonsten eben mit o.g. Holzhammermethode.


cramilu
Aktiv
Dabei seit: 09.06.2019
Mitteilungen: 966
Wohnort: Schwäbischer Wald, seit 1989 freiwilliges Exil in Bierfranken

 Beitrag No.1, eingetragen 2021-04-10 15:45    [Diesen Beitrag zitieren]

Hallo mrdjv2,
in welcher datentechnischen Form hast Du denn den Zeitraum gegeben?
Zwei Datenfelder? character oder date[dd.mm.yyyy/mm.dd.yyyy]?


mrdjv2
Aktiv
Dabei seit: 05.07.2003
Mitteilungen: 1001
Wohnort: Aachen

 Themenstart: 2021-04-10 12:11    [Diesen Beitrag zitieren]

Hallo zusammen,

ich habe in SAS das Problem, dass ich einen Zeitraum gegeben habe (z.B. 02.01.2018 - 03.03.2018). Nun wüsste ich gerne, wie viele Tage dieses Zeitraums auf welchen Monat entfallen.

Das Ziel wäre in dem Beispiel etwas wie:
Januar_2018: 30
Februar_2018: 28
März_2018: 3

Wie kann ich sowas möglichst einfach umsetzen?
Es geht um ein paar Mio. Datensätze. Daher ist "manuell" leider keine Option.
Es muss auch nicht unbedingt SAS sein, aber es wäre von Vorteil.

VG
Daniel


 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]