2016-02-21 199 views
0

如何打印(並導出到文件)每月和每週平均值?該數據被存儲在庫和形式如下:SAS:每月和每週平均打印

Obs. Date     Value 
1  08FEB2016:00:00:00 29.00 
2  05FEB2016:00:00:00 29.30 
3  04FEB2016:00:00:00 29.93 
4  03FEB2016:00:00:00 28.65 
5  02FEB2016:00:00:00 28.40 
(...) 
3078 08MAR2004:00:00:00 32.59 
3079 05MAR2004:00:00:00 32.75 
3080 04MAR2004:00:00:00 32.05 
3081 03MAR2004:00:00:00 31.82 

編輯:我總算得到每月的數據,但我每月分別返回平均值。我希望將它作爲一個結果完成,即月 - 平均值+將其導出到文件或數據集。我仍然不知道如何處理數週。

%macro printAvgM(start,end); 
    proc summary data=sur1.dane(where=(Date>=&start 
     and Date<=&end)) nway; 
    var Value; 
    output out=want (drop=_:) mean=; 
    proc print; 
    run; 
%mend printAvgM; 

%printAvgM('01jan2003'd,'31jan2003'd); 

EDIT2:這裏是我的代碼,一步一步:

libname sur 'C:\myPath'; 
run; 

proc import datafile="C:\myPath\myData.csv" 
out=SUR.DANE 
dbms=csv replace; 
getnames=yes; 
run; 

proc sort data=sur.dane out=sur.dane; 
by Date; 
run; 

libname sur1 "C:\myPath\myDB.accdb"; 
run; 

proc datasets; 
copy in=sur out=sur1; 
select dane; 
run; 

data sur1.dane2; 
set sur1.dane; 
date2=datepart(Date); 
format date2 WEEKV11.; 
run; 

最後一步的結果NOTE: SAS variable labels, formats, and lengths are not written to DBMS tables.和dane2變量的格式是DATETIME19.

+0

請發佈您到目前爲止所嘗試的內容。使用DT格式等格式查看proc手段。 – Reeza

+0

我編輯帖子 – PramusPL

+0

你的數據有多大? – Reeza

回答

1

好吧,它足夠小,可以很容易地處理。我建議首先使用DATEPART()函數將datetime變量轉換爲日期變量,然後在PROC MEANS中使用格式。您可以查看WEEKU和WEEKV格式,看看它們是否符合您的需求。下面的代碼應該足以讓你開始。您可以在沒有日期轉換的情況下每月執行一次,但我無法找到datetime變量的每週格式。

*Fake data generated; 
data fd; 
start=datetime(); 
do i=1 to 3000000 by 120; 
    datetime=start+(i-1)*30; 

    var=rand('normal', 25, 5); 
    output; 
end; 
keep datetime var; 
format datetime datetime21.; 
run; 

*Get date variable; 
data fd_date; 
set fd; 
date_var = datepart(datetime); 
date_month = put(date_var, yymon7,); 
    Date_week = put(date_var, weekv11.); 

    run; 

*Monthly summary; 
proc means data=fd_date noprint nway; 
class date_var; 
var var; 
output out=want_monthly mean(var)=avg_var std(var)=std_var; 
format date_var monyy7.; 
run; 

*Weekly summary; 
proc means data=fd_date noprint nway; 
class date_var; 
var var; 
output out=want_weekly mean(var)=avg_var std(var)=std_var; 
format date_var weekv11.; 
run; 

用新的每月和每週變量替換date_var。因爲這些是字符變量,所以它們不能正確排序。

+0

我遇到轉換問題。由datepart()創建的新'date2'變量的類型爲DATETIME19。這就是我所得到的:SAS變量標籤,格式和長度不會寫入DBMS表。這是因爲數據存儲在_.accdb_文件中? – PramusPL

+0

當試圖執行每月摘要時加上: '注意:在變量date2的數據分類期間發生格式化異常。對於一個或多個值,格式寬度可能太小.' ' – PramusPL

+0

1.我的代碼是否在您的系統上工作? 2.編輯您的問題以包含您實際使用的代碼和收到的錯誤。我假設你已經將數據導入SAS。 – Reeza