Skip to content

Commit a56751a

Browse files
committed
Add weekday method to date object
1 parent 65b0667 commit a56751a

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

src/undate/date.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,27 @@ def day(self) -> Optional[int]:
104104
return int(str(self.astype("datetime64[D]")).split("-")[-1])
105105
return None
106106

107+
@property
108+
def weekday(self) -> Optional[int]:
109+
"""Equivalent to :meth:`datetime.date.weedkay`; returns day of week as an
110+
integer where Monday is 0 and Sunday is 6. Only supported for dates
111+
with date unit in days.
112+
"""
113+
# only return a weekday if date unit is in days
114+
if self.dtype == "datetime64[D]":
115+
# calculate based on difference between current day and week start
116+
# numpy datetime weeks start on thursdays - presumably since
117+
# unix epoch day zero was a thursday...
118+
119+
# implementation inspired in part by https://stackoverflow.com/a/54264187
120+
121+
thursday_week = self.astype("datetime64[W]")
122+
days_from_thursday = (self - thursday_week).astype(int)
123+
# if monday is 0, thursday is 3
124+
return (days_from_thursday + 3) % 7
125+
126+
return None
127+
107128
def __sub__(self, other):
108129
# modify to conditionally return a timedelta object instead of a
109130
# Date object with dtype timedelta64[D] (default behavior)

tests/test_date.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import datetime
2+
13
import numpy as np
24
from undate.date import ONE_YEAR, Date, DatePrecision, Timedelta
35

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

56+
def test_weekday(self):
57+
# thursday
58+
assert Date(2025, 1, 2).weekday == 3
59+
assert Date(2025, 1, 2).weekday == datetime.date(2025, 1, 2).weekday()
60+
# friday
61+
assert Date(2025, 1, 3).weekday == 4
62+
assert Date(2025, 1, 3).weekday == datetime.date(2025, 1, 3).weekday()
63+
# saturday
64+
assert Date(2025, 1, 4).weekday == 5
65+
assert Date(2025, 1, 4).weekday == datetime.date(2025, 1, 4).weekday()
66+
# sunday
67+
assert Date(2025, 1, 5).weekday == 6
68+
assert Date(2025, 1, 5).weekday == datetime.date(2025, 1, 5).weekday()
69+
# monday
70+
assert Date(2025, 1, 6).weekday == 0
71+
assert Date(2025, 1, 6).weekday == datetime.date(2025, 1, 6).weekday()
72+
# tuesday
73+
assert Date(2025, 1, 7).weekday == 1
74+
assert Date(2025, 1, 7).weekday == datetime.date(2025, 1, 7).weekday()
75+
5476
def test_substract(self):
5577
# date - date = timedelta
5678
date_difference = Date(2024, 1, 2) - Date(2024, 1, 1)

0 commit comments

Comments
 (0)