- 📊 Custom month logic lets businesses set monthly periods to fit fiscal or operational needs.
- 📅 Built-in Power Query functions let you change dates in many ways, beyond standard calendar groups.
- 👥 Weeks that cross month boundaries need clear rules, like using the majority of days or the week-end date.
- 🔁 Putting logic into callable functions in Power Query makes code reusable and easier to keep up.
How to Get Good at Power Query Month Work
Many people find month-based reporting in Power Query hard. This is especially true when weeks go across two months. You are not alone if you do. Standard grouping by calendar months often does not give you the freedom you need for business needs. Think of fiscal calendars, marketing cycles, or weekly summaries. This guide shows you key ways to change dates in Power Query. It looks at custom month logic, weeks that span two months, and methods you can use again for actual work.
Power Query Date Handling 101
To build strong transformations, you must know how Power Query handles dates. Power Query (the M language) treats dates as a special type with a structure and meaning. When you bring dates into the Power Query Editor, the system reads them using ISO 8601 rules. This happens unless a change says to do something else.
Inside, dates are numbers with decimals. The whole number part shows how many days have passed since December 30, 1899, just like in Excel. The decimal part shows the time. This makes it easy for many data pros to move data from Excel.
Power Query often finds date fields on its own. It can then change them automatically. For example, it groups them into Year > Quarter > Month > Day in Power BI. But this default way can hide the fact that you need to set up other month structures. These include custom fiscal calendars or rolling 4-4-5 month cycles.
When you need to go past the default ways, getting good at Power Query date changes becomes very important.
Key Date and Month Functions
The M language has many tools for changing dates. This makes it simple to do many things. You can take out a specific part of a date or do complex changes. Below are some key functions. They are useful for moving from calendar logic to custom logic:
Date.Month(date)– Gives a number from 1 to 12 for the month.Date.MonthName(date)– Gives the full month name (e.g., “March”).Date.EndOfMonth(date)– Gives the last date of the month.Date.AddMonths(date, n)– Addsnmonths to the date given (negative numbers go back in time).Date.From(datetime)– Removes the time part of a DateTime value, only giving the date.
Example: Get the name of the month before.
= Date.MonthName(Date.AddMonths([StartDate], -1))
Learning these functions is the basis for more advanced logic. This includes moves to fiscal calendars or offsets linked to how your business works.
Get more info from Microsoft’s official documentation.
Define Custom Reporting Months
Custom month reporting is common in companies. This includes those with fiscal years, marketing cycles, or ways to rotate inventory (like 4-4-5 calendars). Instead of using the first day of each month, your business might set "months" to start on specific days. This could be the 25th or ending in the middle of a month.
Here is how to set up a custom Power Query month rule where a month starts on the 25th:
let
StartDate = [Date],
CustomMonthStart = if Date.Day(StartDate) >= 25 then Date.From(Date.StartOfMonth(StartDate)) + #duration(24,0,0,0)
else Date.From(Date.StartOfMonth(Date.AddMonths(StartDate, -1))) + #duration(24,0,0,0)
in
CustomMonthStart
Why This Works:
- It checks if the day of the month is after the 25th.
- If it is, the date moves forward into the current month, starting on day 25.
- If not, it belongs to the custom period before, starting on the 25th of the last month.
This method gives you the freedom to set up custom reports. These reports will match your internal calendar, no matter when the calendar month starts or ends.
The Problem of Overlapping Weeks
Some of the hardest Power Query month problems happen when weeks are grouped. This is true for things like sales or ticket numbers over "weekly cycles." Problems come up when weeks go over two months. How do you decide which month the week belongs to?
Here are three steady ways to fix this uncertainty:
1. Week End Sets The Month
Give each week to the month of its ending date.
Good points: Simple to figure out. It also matches weekly checks closing on Sundays, for example.
2. Week Start Leads the Grouping
Give a week to the month where it begins.
Good points: Good for dashboards that start on Mondays or for Sunday review times.
3. Majority Rule (Good for Solid Results)
Give the week to the month that has most of its days.
Example of how to do this in M:
let
WeekStartDate = [WeekStart],
WeekDates = List.Dates(WeekStartDate, 7, #duration(1,0,0,0)),
VoteCount = List.Transform(WeekDates, each Date.Month(_)),
ModeMonth = List.Mode(VoteCount)
in
ModeMonth
This method finds the month that has the most days in the week. It helps avoid wrong numbers from weeks ending close to the month line.
Labeling a Week with a Month for Reports
Labels that people can read make dashboards and reports better. Instead of codes or complicated date math, a clearer label like "Week Ending Jan 28" works best.
Here’s how to make these labels in Power Query:
let
WeekStart = [StartDate],
WeekEnd = Date.AddDays(WeekStart, 6),
WeekLabel = "Week Ending " & Date.ToText(WeekEnd, "MMM dd")
in
WeekLabel
These labels change your time data into clear descriptions. This helps people using the reports stay interested.
Quick tip: Make sure all weeks start on the same day—either Sunday or Monday. If needed, change your data to make WeekStartDate columns right.
Working with Fiscal Months
Many companies use fiscal periods instead of calendar months. For example, if your fiscal year starts in April, March is the last month of that fiscal year.
Here’s how you can change dates to fiscal ones using Date.AddMonths:
let
CalendarDate = [Date],
OffsetMonth = Date.AddMonths(CalendarDate, -3), // April becomes Month 1
FiscalMonth = Date.Month(OffsetMonth),
FiscalYear = Date.Year(OffsetMonth)
in
"FY" & Text.From(FiscalYear) & " - M" & Text.From(FiscalMonth)
Do you want this to be more adaptable? Use a setting or a function for the offset:
let
CustomFiscalMonth = (InputDate as date, FiscalStartMonth as number) =>
let
ShiftMonths = 1 - FiscalStartMonth,
DateShifted = Date.AddMonths(InputDate, ShiftMonths),
FiscalMonth = Date.Month(DateShifted),
FiscalYear = Date.Year(DateShifted)
in
"FY" & Text.From(FiscalYear) & "-M" & Text.From(FiscalMonth)
in
CustomFiscalMonth
When you pass the fiscal start month as a setting, your logic can change. This makes it easy to adjust for different business parts and other companies.
Grouping Data by Custom Month Logic
Power Query lets you group data by any column. This includes columns that show custom months. This lets you sum up things like sales or staff numbers using your business's own time frames.
Example of grouping by custom month:
let
Source = ...,
AddCustomMonth = Table.AddColumn(Source, "CustomMonth", each CustomMonthFunction([Date])),
Grouped = Table.Group(AddCustomMonth, {"CustomMonth"}, {{"Total Sales", each List.Sum([Sales]), type number}})
in
Grouped
Steps needed:
- Add a column using your custom logic function.
- Group by that column in the next change.
- Sum up as needed (e.g., total, average, count).
This method lets you change data in powerful ways inside Power Query. You do not need DAX measures.
Make It Reusable: Your Own Month Logic Function
Do not write the same logic again and again. Instead, put complex month logic into functions you can use many times. Power Query makes it simple to set up named functions that you can use anywhere.
Example reusable function for a monthly line starting on the 25th:
let CustomMonthFunction = (InputDate as date) as date =>
let
StartDay = 25,
MonthStart = if Date.Day(InputDate) >= StartDay then Date.AddDays(Date.StartOfMonth(InputDate), StartDay - 1)
else Date.AddDays(Date.StartOfMonth(Date.AddMonths(InputDate, -1)), StartDay - 1)
in
MonthStart
in
CustomMonthFunction
You can save this in a separate query called "fnCustomMonth." Then, you can call fnCustomMonth([Date]) in all your data steps.
Showing Month Labels in Power BI
Power BI visuals look better with clear, named columns. This is true for time-based filters like slicers or chart axes.
When making visuals:
- Use labels that mean something, such as
"FY2024 - M3"or"Week Ending Apr 7". - Set column data types to Text or Categorical in Power BI. This stops automatic grouping by date.
- Do not just use
Date Hierarchyfields. Use them only when you are using standard calendar logic.
Also, think about sorting these labels clearly with extra index fields. For example, you can pair each text label with a number for the month. This helps make sure they show up in the right order in visuals.
Power Query vs. SQL and DAX: What’s Different?
| Feature | Power Query (M) | SQL | DAX |
|---|---|---|---|
| Row-by-row logic | ✅ Very good | ⚠️ Needs a lot of code | ⚠️ Hard to keep up |
| Speed | ✅ Fast during load time | ✅ Good, depends on query | ⚠️ Slower for row work |
| Reusable functions | ✅ Easy to put into code | ❌ Hard without procedures | ✅ Can do, but wordy |
| Grouping options | ✅ Many (custom rules, settings) | ✅ With window functions | ✅ Measures, but less options |
Power Query works very well for complex date logic when you are getting data ready. This leaves lighter measures to DAX for visuals and key numbers.
Common Mistakes to Avoid
- ⚠️ Hardcoded Values: These can become old quickly. Instead, figure them out based on today’s date or other settings.
- ⚠️ Nested Conditional Logic: Too many
ifstatements make code hard to read. Uselet/instructures instead. - ⚠️ Mixed Data Types: Make sure all inputs for date logic are truly
date, nottextordatetime.
Best Ways to Design Month-Based Queries
- ✅ Use clear field names:
CustomMonthLabel,FiscalPeriod,WeekLabel. - ✅ Write down your logic right in the code. This helps others who keep up the work.
- ✅ Use settings for things you assume: like the start of the fiscal year or custom cut-off dates.
Bonus pattern for functions:
let
CustomMonthFunction = (InputDate as date, FiscalStartMonth as number) as text =>
let
ShiftMonths = 1 - FiscalStartMonth,
DateShifted = Date.AddMonths(InputDate, ShiftMonths),
FiscalMonth = Date.Month(DateShifted),
FiscalYear = Date.Year(DateShifted)
in
"FY" & Text.From(FiscalYear) & "-M" & Text.From(FiscalMonth)
in
CustomMonthFunction
This gives you the most control and makes later reporting logic simpler.
Power Query’s ways to change dates, especially for custom month grouping, make it a strong tool for companies. It gives them options beyond the standard calendar. From custom fiscal labels to smart week tasks, learning these methods helps make sure your data setup matches how you do business.
Need a quick start? Get our Free Power Query Custom Month Template on GitHub and begin changing how you handle monthly reporting logic.
Citations
Puranik, M., Kumar, S., & Deb, S. (2021). Business data preparation using Power Query: a review. Data Science Journal, 20(1), 15. https://doi.org/10.5334/dsj-2021-015
Microsoft Docs. (2024). Date functions – Power Query M. Retrieved from https://learn.microsoft.com/en-us/powerquery-m/date-functions
Gartner Research. (2022). Modern BI tools survey.