2016-05-11 278 views
2

嗨,祝你一切順利! 這是我需要解決的問題如果你能幫助我,我會非常樂意。 我有一些數據集,它只包含一個變量日期格式。 實施例:在SAS EG中計算工作日

01JAN2016 
06JAN2016 
15FEB2016 

第二數據集是天 - 一段5年假期。 例如:

01JAN2016 
02JAN2016 

等等,這些日子都不是工作日。

這種情況下,我需要計算從第一組數據到現在的每個觀察日期的工作日數。看來我需要統計天數

「現在的日期」減去日期(從第一個數據集),減去第二個數據集與假日的天數(count(date)where Date(from first data set )<日期<「現在」

回答

2

您可以定義自己的類型區間與SAS funcions intck和intnx使用的這裏是如何做到這一點:

首先創建平日對你有哪個年的表假期,直到現在(或未來)的一年。

這裏我們將從2014年到2016年的所有平日開始。假設您不想計算週末的日子。如果不是這樣,只需修改代碼,以便不應用「(2:6)中的工作日(日期)」條件。您將獲得一年的全部365天。

data mon_fri; 
    do date = "01JAN2014"d to "31DEC2016"d; 
    if weekday(date) in (2:6) then output; 
    end; 
    format date date9.; 
run; 

然後,我們會在表格節假日形成具有所有這些我們剛剛創建的日期表,減去我們有過節。我們將把表放置在名爲myLib的庫中,並將日期列重命名爲「開始」以符合SAS​​自定義間隔。

libname myLib "some/place/on/your/drive"; 

data mylib.workdays(RENAME=(date=Begin)); 
    merge mon_fri (in=weekday) 
     Holidays (in=holiday); 
    by date; 
    if weekday and not holiday then output; 
run; 

現在我們設置一個自定義時間間隔,我們將簡單地稱爲「工作日」。

options intervalds=(workdays=mylib.workdays); 

從那裏,你已經離開做的是這樣的:

data dateCalculations; 
    set mydata; 
    numOfDays = intck("workdays", theDate, today()); 
run; 

SAS將計算時間(在工作日的數據集線)分離的開始日期的數量的護理(列稱爲theDate)從enddate(今天的日期)。

等voilà!

+0

謝謝,但我需要計算假期+週末 – bobby1232

+0

好吧,那麼只需輸入每個日期,就可以像我那樣計算數據集,並使用該數據集定義自定義間隔!你可以在週末(日期)(1,7)'中獲得週末,然後將這些與你的假期連接起來,按日期排序,重命名爲「開始」,然後你就可以開始了! –

+0

謝謝!真的行! – bobby1232

0

這是美好的,非常有幫助。我使用兩個不同的SAS系統(都在遠程Unix服務器上)。設置intervalds選項似乎只適用於其中之一。我複製/粘貼相同的代碼,另一方面沒有任何反應 - 沒有警告,沒有錯誤,它根本不起作用。

這是我如何設置它(從雅虎下載CSV!財政部對於S & P500,每天的數據,從1950年1月):

PROC IMPORT DATAFILE="sp500_1950_2016.csv" 
      OUT=sp500_1950_2016 
      DBMS=DLM 
      REPLACE; 
      delimiter=','; 
      getnames=yes; 
RUN; 
data trading_days; 
set sp500_1950_2016 (keep = date rename=(date=begin)); 
    where year(begin) < 2017; 
run; 
options intervalds=(TradingDay=trading_days) ; 

然後我把它像這樣算我應該從基金成立到2016年12月31日或當基金關閉的意見數量,以較早者爲準:

data ops2; set operations_master; where ~missing(inception); 
if missing(enddate) then enddate = '31dec2016'd; 
datadays = INTCK('TradingDay',inception,enddate);run; 
proc univariate; var datadays;run;quit; 

在系統1上,這工作得很好。在系統2上,我爲變量數據點得到0。我已經檢查過是否有設置intervalds選項的系統管理員覆蓋,並且沒有。有沒有另一個原因,爲什麼這可能無法在給定的系統上工作?