Excel stores time durations as days

Published on in Excel

For example, 6 hours is stored as 0.25 days. To format a duration as hh:mm:ss.000, first convert the duration to days.

Table of contents

Example problem

A friend of mine consulted me with this problem: he was copy-pasting a bunch of time durations to Excel and wanted to calculate their average duration.

The values were not in Excel-friendly format, and he didn't want to modify them by hand, so Excel's AVERAGE function didn't work out of the box.

Here's an example of a single time duration:

1:39.811

That's one minute, 39 seconds and 811 milliseconds.

Failed attempts

I first tried to change the formatting of the data, hoping that Excel would correctly identify the data as time durations. But I couldn't get that to work.

I then tried to parse the text and pass its parts to the TIME function which takes three parameters: hours, minutes and seconds. But passing a decimal number (i.e. seconds with milliseconds) as the third parameter didn't work.

Solution

Converting the raw data to milliseconds

In the end, I found it easiest to convert the raw data to milliseconds using Excel's LEFT, MID and RIGHT functions.

Here's the formula for the B column, assuming that the original data resides in the A column:

// A1 contains a duration, e.g. "1:39.811"

// B1 contains the duration in milliseconds.
// In this case it would be "99811"
=
  // Minutes:
  // the first character from the left.
  // Doesn't support 10+ minute durations,
  // but that's probably OK with this data.
  LEFT(A1; 1) * 1000 * 60

  // Seconds:
  // starting from the third character (1-indexed),
  // take two characters in the middle.
  + MID(A1; 3; 2) * 1000

  // Milliseconds:
  // the three rightmost characters.
  + RIGHT(A1; 3)

Now that the B column contains the time durations in milliseconds, it's easy to calculate the average value:

=AVERAGE(B1:B999)

But how to format the result as a time duration?

Displaying milliseconds as a duration

Luckily, someone had asked "[How to] convert milliseconds to hh:mm:ss.000" on Reddit four years ago, and someone called sqylogin had shared this nugget of wisdom (formatted for clarity):

Excel stores data in days.

Therefore, 1 millisecond = 1/24/60/60/1,000 = 1/86,400,000.

To convert 586 milliseconds to an Excel "day," divide it by 86.4 million, and in the resulting cell, use this custom number format: HH:MM:SS.000.

Ah, so calculating the average time duration is as easy as this:

=AVERAGE(B1:B999) / 86400000

Plus the formatting of the cell displaying the average value needs to be set to this:

m:ss.000

Egg-cellent! Now my friend can keep copy-pasting values to the A column, and the average value will be updated automatically. He can even hide the B column since it's only used as an intermediate step to calculate the average value.

The actual learning

Excel is often a very powerful and quick tool to use. But sometimes it doesn't work like I would want it to, so I end up fighting it and coming up with hacky solutions like this.

To be fair, maybe that applies to all tools and even programming in general.