[Thread Prev][Thread Next][Index]

Re: [ferret_users] working with data of a month over the years



Hi Ansley and Peter,
                       This method remains the simplest one, but two points
should be taken careoff:

  1. The output of MOD(T[GT=precip], 360) function depends CRUCIALLY on T0
       and time units. Hence, a correction for T0 (so that the MOD function
       returns 1 for all 01-JAN and 30 for all 30-JAN) is required.

  2. Assume that time value 1 implies 01-JAN. Then, multiples of 360 (ie 
       30-DEC) will result in "0" residue and which is not accounted for 
       in the present IF statement.

Please have a trial with the stand alone example given below. Use the 
second method to get accurate results.

Pleaes let me know if you have any questions.

Best regards,

Jaison

!---------------example starts here-------------------------------
\cancel mode verify
! Description : Example script for extracting January data from a daily 
!                  30-year time series on 360-day calendar.
!
!-----------------------------------------------------------------

!--create a dummy variable : 360_DAY calendar, daily, 30-years

     define axis/t=01-JAN-1971:30-DEC-2000:1/units=days/calendar=360_DAY\
                   /t0=30-JAN-1971  t30yr
     let var = SIN(t[gt=t30yr]/500)
 
!---This method will result in wrong answer 

     let year_days  =  MOD(t[gt=var],360)
     let daily_mask =  IF year_days LE 30 THEN 1
     let var_jan_all= var * daily_mask
     let var_jan    = COMPRESSL(var_jan_all)
     let jan_pts    = var_jan[l=@NGD]
     list jan_pts

!---The accurate method....

     ! 1.  assume that time units are days
     ! 2.  remove the effects of T0 on T-values
     ! 3.  account for 30-DEC (or multiples of 360)

     let t_jan_base =  T[gt=var] - t[gt=var,t=01-JAN-1971] + 1  ! step 2
     let year_days  =  MOD(t_jan_base,360)
     let daily_mask =  IF year_days GE 1 AND year_days LE 30 THEN 1 ! step 3
     let var_jan_all= var * daily_mask
     let var_jan    = COMPRESSL(var_jan_all)
     let jan_pts    = var_jan[l=@NGD]
     list jan_pts

    !list/l=1:35 daily_mask      
    !list/l=325:365 daily_mask      
    !list/l=715:755 daily_mask      
    !list/l=3595:3635 daily_mask
!---------------example ends   here-------------------------------


        
  

On Thu, 03 Jan 2008 09:22:36 -0800, Ansley Manke wrote
> Hi,
> In Ferret, anytime you find yourself using REPEAT loops, it's a good 
> idea to think whether there's a way to define an expression that 
> will do the same thing.  Here's an FAQ that does something similar 
> to what you're trying:
> 
> http://ferret.pmel.noaa.gov/FERRET_17sep07/FAQ/analysis/
seasonal_masking.html
> 
> The example in the FAQ has daily data, as yours is, so you will be 
> able to use the example directly to define a mask for days between 1 
> and 30.  It looks as if you have a 360-day year, is that correct?  
> If so, and if the variable in your file were called precip, then
> 
>     yes? LET year_days = MOD(T[GT=precip], 360)
>     yes? LET daily_mask = IF year_days LE 30 THEN 1
> 
>     yes? LET precip1 = precip * daily_mask
> 
> This will give you a variable with 30 days of precip data, then 330 
> days of missing data, and so forth.  Try these commands to see what 
> you've done (choosing some location where your data exists to plot 
> precip1)
> 
>     yes? PLOT daily_mask
>     yes? PLOT/x=180/y=0 precip1
> 
> You could use a COMPRESSL function to put all the January data 
> together without the gaps if that would be useful for your analysis:
> 
> yes? show function compressL
> COMPRESSL(DAT)
>     Returns data, compressed along the L axis: Missing points moved 
> to the end    DAT: variable to compress in L yes? LET precip_jan = 
> compressL(precip1) ...
> 
> Peter Szabo wrote:
> > Dear Ferreters,
> >
> > I am using ferret on XP. I have equally spaced daily data in time (30days*
> > 12months* 30years). I would like to eliminate everything but data of 
january
> > over the years i order that i could do other things with the january data.
> >
> > I tried looking it up in the archives and I tried with the following but
> > have not succeeded yet:
> > -----------------
> > repeat/l=1:10800:1 (let precip2=if ((`l` ge 1 and `l` le 30) or (`l` ge 
361
> > and `l` ge 390) or (`l` ge 721 and `l` le 750) or (`l` ge 1081 and `l` le
> > 1110) or....(and so on)....) then precip else precip*0.0)
> > -----------------
> > Does anyone can help me?
> >
> > Peter Szabo
> > elte
> >
> >
> 
> -- 
> This message has been scanned for viruses and
> dangerous content by MailScanner, and is
> believed to be clean.


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.



[Thread Prev][Thread Next][Index]

Contact Us
Dept of Commerce / NOAA / OAR / PMEL / TMAP

Privacy Policy | Disclaimer | Accessibility Statement