A friend of mine emailed yesterday asking how to compare data from different timezones. With how good the UI is in Power Query, you’d think this would be easy. Unfortunately it’s a bit less than that, so I thought it would make a good example for today’s post.
Background
Let’s assume that we’ve got two columns of data; an Order Date and a Shipping Date. We’d like to work out the number of days it took to ship our order. Easy enough, we just need to subtract one from the other… except… the system that holds the Order Date reports it in UTC +0:00, and the shipping date is done from my home time zone (UTC –7:00).
The data table we’re starting with looks like this:
And you can download a copy of the workbook from my OneDrive here if you’d like to follow along.
Avoiding Temptation
So the first thing to do is pull the data in to Power Query. So I clicked in the table, went to the Power Query tab, and chose From Table. At this point we’re greeted with a nice table, and our first temptation is to go directly to the Transform tab and set the Data Type to Date/Time/Timezone:
And herein lies a problem. The system has forced my local TimeZone on the data. As specified in the initial problem, I need this to carry a UTC +0:00 distinction.
It’s a shame that there is no intermediate step here (how often do I ask for MORE clicks?) which allowed you to specify WHICH TimeZone. If you’re into working with data from different regions (I.e. this feature), I’d don’t think I’m venturing out on a limb to say that this is pretty important.
To further complicate things, that is the extent of the TimeZone functionality in the UI. And that’s not going to help us. So let’s knock off the “Changed Type” step and look at this another way.
Using M to Deal with Data From Different TimeZones
The secret to making this work is to take explicit control of the time zone settings using some Power Query M functions. It’s not as hard as it sounds. In fact, we’re only going to use two in this example:
- DateTime.AddZone to add a time zone to a DateTime data type
- DateTimeZone.SwitchZone to convert from one time zone to another
I discovered both of these functions by searching the Power Query formula categories article on Microsoft’s site.
Forcing a DateTime to a Specific Time Zone
So we’re currently looking at this data in Power Query:
Let’s create a new column to convert the OrderDate:
- Add Column –> Add Custom Column
- Name: Order Date (UTC +0:00)
- Formula: =DateTime.AddZone([OrderDate],0)
The secret here is in the last parameter, as we get to specify the time zone. Since we know these dates/times come out of our system in UTC +0:00, we’re good to not add anything to it. The result is shown below:
Converting a DateTime to a Different Time Zone
Now, in order to be able to compare our DateTimes easily, we want them both to be based in our own time zone. Since my business works in UTC –7:00, I really want my Order Date represented in that time zone as well. So let’s convert it.
- Add Column –> Add Custom Column
- Name: Order Date (UTC -7:00)
- Formula: =DateTimeZone.SwitchZone([#"OrderDate (UTC +0:00)"],-7)
Beautiful.
Just a note here… It may have been tempting to force this data to UTC –7:00 when we added the time zone above, but that would have assigned the date based in the wrong time zone. I.e. our first record would have returned 7/4/1996 1:12:00 PM –07:00, which is not the same as what we ended up with.
Forcing another DateTime to a Different Time Zone
Now we need to deal with the ShippedDate column, forcing that to my local time. I could just select the column and turn it into a Date/Time/Timezone data type, but I won’t. Why? What if I send this workbook to another user? It will return THEIR time zone, not mine. And that could be different. Much better to explicitly set it.
- Add Column –> Add Custom Column
- Name: ShippedDate (UTC –7:00)
- Formula: DateTime.AddZone([ShippedDate],-7)
Notice that this time we do force it to be in the –7 time zone, as these DateTimes originated from that time zone. The result:
Fantastic. We’ve added time zone data, without changing the original times.
Let’s just go do a little bit of cleanup now:
- Select the OrderDate and ShippedDate columns
- Transform –> Data Type –> Date/Time
- Select OrderDate (UTC +0:00) through ShippedDate (UTC –7:00)
- Transform –> Date Type –> Date/Time/Timezone
Excellent. Now they should show up correctly when we load them to an Excel table instead of losing their formatting.
Making Comparisons
We’re at the final step now: Working out the time to ship. This is relatively straight forward:
- Add Column –> Add Custom Column
- Name: Days to Ship
- Formula: [#"ShippedDate (UTC -7:00)"]-[#"OrderDate (UTC -7:00)"]
- Select the Days to Ship column
- Transform –> Data Type –> Duration
Note: You can just double click the column names in the formula wizard and it will put the # characters in there for you.
And the final look in Power Query:
With that all complete, the final step is to give the query a name (I chose ShippingTimes) and load it to a worksheet:
Final Thoughts
Personally, I like to take explicit control over my data types. Call me a control freak if you like (I’ve been called much worse) but relying on implicit conversions that set to “local time” scare me a bit, particularly if I’m going to be sending my workbook off to someone who lives in a different zone than I do. Once you know how to do this it’s not super difficult, and I now know EXACTLY how it will represent on their side.
I’ll admit also that I’m a bit disappointed in the UI for datetime conversions. To me, anyone playing in this field needs very granular control over every column. An extra step in the Transform to Date/Time/Timzone step would go a long way to solving this, as you’d be able to skip writing custom formulas. Hopefully that’s on the Power Query team’s radar for the future, as well as a full datetime menu that would allow us to easily choose from/add/convert to the majority of the formulas found in the article referenced above.
Power Query Training
Also don't forget. If you love Power Query or are intrigued by the things you can do with it, we have an online training course coming up soon. Check it out and register at www.powerquery.training/course
The post Data From Different TimeZones appeared first on The Ken Puls (Excelguru) Blog.