Skip to content

Commit

Permalink
Add weekday method to date object
Browse files Browse the repository at this point in the history
  • Loading branch information
rlskoeser committed Feb 7, 2025
1 parent bf132f4 commit 05eddc0
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
21 changes: 21 additions & 0 deletions src/undate/date.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,27 @@ def day(self) -> Optional[int]:
return int(str(self.astype("datetime64[D]")).split("-")[-1])
return None

@property
def weekday(self) -> Optional[int]:
"""Equivalent to :meth:`datetime.date.weedkay`; returns day of week as an
integer where Monday is 0 and Sunday is 6. Only supported for dates
with date unit in days.
"""
# only return a weekday if date unit is in days
if self.dtype == "datetime64[D]":
# calculate based on difference between current day and week start
# numpy datetime weeks start on thursdays - presumably since
# unix epoch day zero was a thursday...

# implementation inspired in part by https://stackoverflow.com/a/54264187

thursday_week = self.astype("datetime64[W]")
days_from_thursday = (self - thursday_week).astype(int)
# if monday is 0, thursday is 3
return (days_from_thursday + 3) % 7

return None

def __sub__(self, other):
# modify to conditionally return a timedelta object instead of a
# Date object with dtype timedelta64[D] (default behavior)
Expand Down
22 changes: 22 additions & 0 deletions tests/test_date.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import datetime

import numpy as np
from undate.date import ONE_YEAR, Date, DatePrecision, Timedelta

Expand Down Expand Up @@ -51,6 +53,26 @@ def test_properties_day(self):
assert Date(2010, 5).day is None
assert Date(2021, 6, 15).day == 15

def test_weekday(self):
# thursday
assert Date(2025, 1, 2).weekday == 3
assert Date(2025, 1, 2).weekday == datetime.date(2025, 1, 2).weekday()
# friday
assert Date(2025, 1, 3).weekday == 4
assert Date(2025, 1, 3).weekday == datetime.date(2025, 1, 3).weekday()
# saturday
assert Date(2025, 1, 4).weekday == 5
assert Date(2025, 1, 4).weekday == datetime.date(2025, 1, 4).weekday()
# sunday
assert Date(2025, 1, 5).weekday == 6
assert Date(2025, 1, 5).weekday == datetime.date(2025, 1, 5).weekday()
# monday
assert Date(2025, 1, 6).weekday == 0
assert Date(2025, 1, 6).weekday == datetime.date(2025, 1, 6).weekday()
# tuesday
assert Date(2025, 1, 7).weekday == 1
assert Date(2025, 1, 7).weekday == datetime.date(2025, 1, 7).weekday()

def test_substract(self):
# date - date = timedelta
date_difference = Date(2024, 1, 2) - Date(2024, 1, 1)
Expand Down

0 comments on commit 05eddc0

Please sign in to comment.