Excel.Tips.Net Welcome toExcel.Tips.Net

Helpful Links

Tips.Net Home
ExcelTips Home
Ask an Excel Question
Make a Comment

Tips.Net Store

ExcelTips FAQ
ExcelTips Premium

Learn Access Now
Free Printable Forms

Beauty Tips
Car Tips
Cleaning Tips
College Tips
Cooking Tips
Excel2007 Tips
ExcelTips
Family Tips
Gardening Tips
Health Tips
Home Tips
Legal Tips
Money Tips
Organizing Tips
Pest Tips
Pet Tips
Wedding Tips
Word2007 Tips
WordTips

Advertise on the
ExcelTips Site

Newest Tips

Converting to Octal

Filtering Columns for Unique Values

Printing Multiple Worksheets on a Single Page

Changing the Default Font

Creating a Drawing Object

Determining a Value of a Cell

Understanding Macros

 

Calculating Averages by Date

Summary: When you have a huge amount of daily data to analyze, you may want to calculate an average of values for any given date in the data. This may seem daunting, but can be done relatively easily using the formulas described in this tip. (This tip works with Microsoft Excel 97, Excel 2000, Excel 2002, Excel 2003, and Excel 2007.)

Suppose that you have a huge worksheet that contains all the rainfall readings for a given locale for the past hundred years or so. In cells A2:A37987 you have the dates, 1 January 1903 through 31 December 2006. In cells B2:B37987 you have the measurements for each date. Further, some of the measurements can be zero (if there is no rainfall for the day) or blank (if no reading was taken that particular day). With all this information, you want to calculate the average historic rainfall for any given day of the year.

One solution involves the use of array formulas, as detailed here:

  1. Select all the cells in column A that contain dates, and assign this range the name Dates.
  2. Select all the cells in column B that contain rainfall data, and assign this range the name Rainfall.
  3. In column D, starting in cell D2, place all the days of the year. You should end up with D2 through D366 filled with dates.
  4. In cell E2, enter the following array formula (terminate the formula by pressing Shift+Ctrl+Enter). The result of the formula is the sum of all the cells in the Rainfall range, for the date specified in cell D2.
  5. =SUM((MONTH(Dates)=MONTH(D2))*(DAY(Dates)=DAY(D2))*Rainfall)
    
  6. In cell F2, enter the following array formula (terminate the formula by pressing Shift+Ctrl+Enter). The result of the formula is the number of cells in the Rainfall range, for the date in cell D2, that have a value in them.
  7. =SUM((MONTH(Dates)=MONTH(D2))*(DAY(Dates)=DAY(D2))*(Rainfall<>""))
    
  8. In cell G2, enter the following regular formula. This is your average for the date in cell D2.
  9. =IF(F2<>0,E2/F2,"")
    
  10. Select the range E2:G2 and copy down for all the dates shown in column D.

This approach works, but it takes quite a while to calculate. This is because you effectively entered 730 array formulas, each checking over 37,000 cells. This is a lot of work, and consequently it may appear like your machine has "hung" after you complete step 7. It has not hung; it will just take it a while to complete the calculations.

To decrease the number of calculations that must be performed, you can use a variation on the above steps. Follow steps 1 through 3, as noted, and then place the following array formula into cell E2:

=AVERAGE(IF(ISNUMBER(Dates)*ISNUMBER(Rainfall)*(MONTH(Dates)=MONTH(D2))*(DAY(Dates)=DAY(D2)),Rainfall))

You can then copy the formula down for all the dates shown in column D. The result of this formula is the actual average rainfall, the same as had been shown in column G in the previous approach.

This formula works because of the way that Boolean arithmetic works in Excel. The ISNUMBER function returns either True or False, and the comparisons (MONTH and DAY) return either True or False. These results are all multiplied against each other, resulting in True only if all the individual tests are True. Only if they are all True will the average of the Rainfall for that particular date be calculated.

You can reduce the calculation overhead even further by simply getting rid of all the table that calculates the averages for every day of the year. With your dates in rainfall in columns A and B, follow these steps:

  1. Select all the cells in column A that contain dates, and assign this range the name Dates.
  2. Select all the cells in column B that contain rainfall data, and assign this range the name Rainfall.
  3. In cell D2, place the date for which you want to check the average rainfall. (The year isn't important; only the month and day are used in the calculation.)
  4. Enter the following formula into cell E2:
=AVERAGE(IF(ISNUMBER(Dates)*ISNUMBER(Rainfall)*(MONTH(Dates)=MONTH(D2))*(DAY(Dates)=DAY(D2)),Rainfall))

That's it. Now, you can change the date in cell D2 as desired, and cell E2 will always indicate the average rainfall for that date. The formula in cell E2 is the same as the formula used in the last approach; the difference is that you aren't calculating it for all the days in a year, and thus the calculation is done much quicker.

Another approach involves the use of Excel's filtering capabilities. Before you can use them properly, however, you must create a column that shows only the month and day for each date in your data. Use this formula in cell C2:

=MONTH(A2) & "-" & DAY(A2)

Now, turn on AutoFiltering (Data | Filter | AutoFilter or, in Excel 2007, the Data tab on the ribbon | Sort & Filter group | Filter) and use the drop-down list at the top of the new column to select the date for which you want an average. You then use the following formula, placed in any cell desired, to show the average rainfall for the selected date:

=SUBTOTAL(1,B:B)

ExcelTips is your source for cost-effective Microsoft Excel training. This tip (2350) applies to Microsoft Excel versions: 97 | 2000 | 2002 | 2003 | 2007

Save Time and Money! Many people need to keep track of employee time, but don't know where to start when it comes to creating a spreadsheet. Here's a way to save time, effort, and money with ready-to-use timesheet templates.
 
Check out Timesheet Templates today!