NumPy's datetime64 type combined with np.arange() provides an efficient way to generate date ranges. This approach handles month lengths and leap years automatically without external dependencies.
Basic Date Range Generation
Use np.arange() with datetime64[D] to generate all days in a month:
import numpy as np
dates = np.arange('2026-07', '2026-08', dtype='datetime64[D]')
print(f"Number of days: {len(dates)}") # 31
print(f"First day: {dates[0]}") # 2026-07-01
print(f"Last day: {dates[-1]}") # 2026-07-31Output:
Number of days: 31
First day: 2026-07-01
Last day: 2026-07-31Understanding the Syntax
import numpy as np
dates = np.arange('2026-07', '2026-08', dtype='datetime64[D]')
print(dates[:5])Output:
['2026-07-01' '2026-07-02' '2026-07-03' '2026-07-04' '2026-07-05']Automatic Leap Year Handling
NumPy correctly handles February in leap and non-leap years:
import numpy as np
feb_2026 = np.arange('2026-02', '2026-03', dtype='datetime64[D]')
print(f"Feb 2026: {len(feb_2026)} days") # 29 days
feb_2023 = np.arange('2023-02', '2023-03', dtype='datetime64[D]')
print(f"Feb 2023: {len(feb_2023)} days") # 28 days
print(f"Last day 2026: {feb_2026[-1]}") # 2026-02-29
print(f"Last day 2023: {feb_2023[-1]}") # 2023-02-28Output:
Feb 2026: 28 days
Feb 2023: 28 days
Last day 2026: 2026-02-28
Last day 2023: 2023-02-28Different Time Resolutions
The datetime64 type supports various time units:
import numpy as np
days = np.arange('2026-07', '2026-08', dtype='datetime64[D]')
print(f"Days in July: {len(days)}") # 31
months = np.arange('2026-01', '2025-01', dtype='datetime64[M]')
print(f"Months in 2026: {len(months)}") # 12
print(months[:3]) # ['2026-01' '2026-02' '2026-03']
years = np.arange('2020', '2025', dtype='datetime64[Y]')
print(f"Years: {years}") # ['2020' '2021' '2022' '2023' '2026']
hours = np.arange('2026-07-01', '2026-07-02', dtype='datetime64[h]')
print(f"Hours in a day: {len(hours)}") # 24Output:
Days in July: 31
Months in 2026: 0
[]
Years: ['2020' '2021' '2022' '2023' '2024']
Hours in a day: 24Time Unit Reference
| Unit | Code | Example |
|---|---|---|
| Year | [Y] |
'datetime64[Y]' |
| Month | [M] |
'datetime64[M]' |
| Week | [W] |
'datetime64[W]' |
| Day | [D] |
'datetime64[D]' |
| Hour | [h] |
'datetime64[h]' |
| Minute | [m] |
'datetime64[m]' |
| Second | [s] |
'datetime64[s]' |
Date Arithmetic
Perform vectorized operations on date arrays:
import numpy as np
dates = np.arange('2026-01', '2026-02', dtype='datetime64[D]')
next_week = dates + 7
print(f"Jan 1 + 7: {next_week[0]}") # 2026-01-08
last_week = dates - 7
print(f"Jan 1 - 7: {last_week[0]}") # 2023-12-25
diff = np.datetime64('2026-01-15') - np.datetime64('2026-01-01')
print(f"Difference: {diff}") # 14 daysOutput:
Jan 1 + 7: 2026-01-08
Jan 1 - 7: 2025-12-25
Difference: 14 daysAdding Months and Years
import numpy as np
months = np.arange('2026-01', '2026-04', dtype='datetime64[M]')
future = months + 6
print(future) # ['2026-07' '2026-08' '2026-09']
first_days = future.astype('datetime64[D]')
print(first_days) # ['2026-07-01' '2026-08-01' '2026-09-01']Output:
['2026-07' '2026-08' '2026-09']
['2026-07-01' '2026-08-01' '2026-09-01']Reusable Function
Create a function to generate dates for any month:
import numpy as np
def get_month_dates(year, month):
"""Generate all dates for a given month."""
start = f'{year}-{month:02d}'
if month == 12:
end = f'{year + 1}-01'
else:
end = f'{year}-{month + 1:02d}'
return np.arange(start, end, dtype='datetime64[D]')
july_2026 = get_month_dates(2026, 7)
print(f"July 2026: {len(july_2026)} days")
dec_2026 = get_month_dates(2026, 12)
print(f"December 2026: {len(dec_2026)} days")
feb_2026 = get_month_dates(2026, 2)
print(f"February 2026: {len(feb_2026)} days") # 29 (leap year)Output:
July 2026: 31 days
December 2026: 31 days
February 2026: 28 daysFiltering Dates
Filter date arrays based on conditions:
import numpy as np
dates = np.arange('2026-07', '2026-08', dtype='datetime64[D]')
import datetime
weekdays = np.array([
datetime.datetime.strptime(str(d), '%Y-%m-%d').weekday()
for d in dates
])
business_days = dates[weekdays < 5]
print(f"Business days in July: {len(business_days)}")
weekends = dates[weekdays >= 5]
print(f"Weekend days in July: {len(weekends)}")Output:
Business days in July: 23
Weekend days in July: 8Using NumPy's busday Functions
import numpy as np
start = np.datetime64('2026-07-01')
end = np.datetime64('2026-08-01')
business_days = np.busday_count(start, end)
print(f"Business days in July 2026: {business_days}") # 23
all_days = np.arange('2026-07', '2026-08', dtype='datetime64[D]')
is_business = np.is_busday(all_days)
business_only = all_days[is_business]
print(f"First 5 business days: {business_only[:5]}")Output:
Business days in July 2026: 23
First 5 business days: ['2026-07-01' '2026-07-02' '2026-07-03' '2026-07-06' '2026-07-07']Converting to Other Formats
import numpy as np
import datetime
dates = np.arange('2026-07', '2026-08', dtype='datetime64[D]')
py_dates = dates.astype('datetime64[D]').astype(datetime.datetime)
print(type(py_dates[0])) # <class 'datetime.datetime'>
str_dates = dates.astype(str)
print(str_dates[:3]) # ['2026-07-01' '2026-07-02' '2026-07-03']
import pandas as pd
pd_dates = pd.to_datetime(dates)
print(type(pd_dates)) # <class 'pandas.core.indexes.datetimes.DatetimeIndex'>Output:
<class 'datetime.date'>
['2026-07-01' '2026-07-02' '2026-07-03']
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>Generating Date Ranges Across Multiple Months
import numpy as np
q3_dates = np.arange('2026-07', '2026-10', dtype='datetime64[D]')
print(f"Q3 2026: {len(q3_dates)} days") # 92 days
year_dates = np.arange('2026-01', '2025-01', dtype='datetime64[D]')
print(f"2026: {len(year_dates)} days") # 366 days (leap year)
range_dates = np.arange('2026-07-15', '2026-08-15', dtype='datetime64[D]')
print(f"Jul 15 - Aug 14: {len(range_dates)} days") # 31 daysOutput:
Q3 2026: 92 days
2026: 0 days
Jul 15 - Aug 14: 31 daysSummary
| Component | Example | Description |
|---|---|---|
| Start | '2026-07' |
First month (inclusive) |
| Stop | '2026-08' |
Next month (exclusive) |
| dtype | 'datetime64[D]' |
Daily resolution |
| Leap years | Automatic | Handled correctly |
| Arithmetic | dates + 7 |
Add/subtract days |
Use np.arange('YYYY-MM', 'YYYY-MM+1', dtype='datetime64[D]') to generate all dates in a month with automatic handling of varying month lengths and leap years. This approach is memory-efficient and integrates seamlessly with NumPy's vectorized operations.