בשלושת השבועות האחרונים הכרנו את שלושת סוגי משתני הזמן הקיימים ב – SAS: תאריך, שעה ותאריך-שעה. ראינו גם איך ניתן להזין ערכים למשתנים מסוגים אלו ומספר פונקציות לבנייה ופירוק שלהם.
עכשיו הגענו לחלק היותר מעניין – איך אפשר לשנות ולחשב ערכי זמן שונים כטוב ליבנו. ובכן יש לי חדשות טובות וחדשות רעות. נתחיל בטובות – אנחנו צריכים להכיר שתי פונקציות בלבד ב – SAS כדי לקבל מענה ל - 95% מכל צרכי חישובי הזמנים שלנו. החדשות הרעות הן שהשמות שלהן לא הכי קלים לזכירה ושלכל אחת מהן יש עד ארבעה פרמטרים שונים.
השבוע נתמקד בפונקציה שמאפשרת לנו להזיז משתנה זמן כלשהו קדימה או אחורה ושמה הוא INTNX. אני מניח שאלו ראשי תיבות של משהו כמו למשל FBI או TARDIS אבל לא הצלחתי למצוא את השם המפורט אז פשוט נצטרך להשתמש בעוצמת הזיכרון הגולמי שלנו כדי לזכור אותו בע"פ.
בצורה הפשוטה שלה הפונקציה INTNX מקבלת שלושה פרמטרים. הראשון הוא יחידת הזמן אותה אנחנו רוצים להזיז בתוך מרכאות (בודדות או כפולות) למשל ‘month’ או ‘day’. הפרמטר השני הוא משתנה הזמן שאותו אנחנו רוצים לעבד והמשתנה השלישי הוא מספר יחידות הזמן בהן שאנחנו רוצים להזיז את התאריך שלנו קדימה (מספר חיובי) או אחורה (מספר שלילי). כמה דוגמאות:
data _null_;
d="12sep2020"d;
t='13:43'T;
d1=intnx('day', d, -45);
put d1= ddmmyy10.;
d2=intnx('week', d, 4);
put d2= ddmmyy10.;
d3=intnx('month', d, -3);
put d3= ddmmyy10.;
t1=intnx('hour', t, 3);
put t1= time8.;
t2=intnx('second', t, -560);
put t2= time8.;
run;
שימו לב שאם אנחנו עובדים על משתנה מסוג תאריך-זמן אנחנו צריכים להשתמש בשמות ייעודיים עבור יחידות הזמן עם ‘dt’ בהתחלה כמו למשל ,dtday, dtmonth, dtyear וכו' במקום השמות הרגילים:
data _null_;
dt="12sep2020:21:00:00"dt;
dt1=intnx('dtday', dt, -45);
put dt1= datetime22.;
dt2=intnx('hour', dt, 4); * no need to use the dt prefix for time units but dthour will work too;
put dt2= datetime22.;
dt3=intnx('dtqtr', dt, -3);
put dt3= datetime22.;
run;
חדי העין וזריזי המחשבה שבינינו בטח שמו לב שבחלק מהדוגמאות למעלה נקודת הזמן שקיבלנו כתוצאה מהחישוב היא לא תמיד מה שבהכרח ציפינו לקבל. נראה שכאשר הפונקציה INTNX מבצעת את הקפיצות בזמן היא תמיד מביאה אותנו להתחלה של יחידת הזמן אליה קפצנו. למשל d3 הוא אומנם 3 חודשים לפני התאריך שבמשתנה d אבל הוא הביא אותנו לראשון ביוני ולא ל – 12 כמו התאריך בספטמבר ממנו התחלנו.
בדיוק לשם כך הפונקציה INTNX כוללת גם את הפרמטר הרביעי שמאפשר לנו לשלוט על הנקודה הספציפית בתוך יחידת הזמן אליה אנחנו רוצים לקפוץ. הוא יכול להיות אחד מארבעה ערכים: “b” או “beginning” (זו ערך ברירת המחדל), “m” או “middle” (אמצע התקופה), “s” או “sameday” ו – “e” או “end”. כמו הפרמטר הראשון גם הערך של הפרמטר הרביעי צריך להיות בתוך מרכאות כפולות או בודדות. נראה לי שדי ברור מהשמות מה כל ערך של הפרמטר נותן אבל דוגמאות זה תמיד טוב:
data _null_;
d="12sep2020"d;
t='13:43'T;
dt="12sep2020:21:00:00"dt;
d1=intnx('month', d, 0, 'e'); * The end of the current month;
put d1= ddmmyy10.;
d2=intnx('month', d, -5, 's'); * Same day in month 5 months ago;
put d2= ddmmyy10.;
t1=intnx('hour', t, -4, 'same'); * Same same;
put t1= time8.;
dt1=intnx('dtday', dt, 10, 'm'); * Middle of the day, 10 days in the future if you need to meet someone for a dual;
put dt1= datetime22.;
run;
חגי