From 59a35235c3437b4c5c780ee879c2f3322c16a583 Mon Sep 17 00:00:00 2001 From: Andrew Grangaard Date: Mon, 25 Oct 2021 01:59:12 -0700 Subject: [PATCH 1/6] [mypy] Fixes typing errors in other/date_to_weekday --- other/date_to_weekday.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/other/date_to_weekday.py b/other/date_to_weekday.py index 9dc68666e3b4..57404da63440 100644 --- a/other/date_to_weekday.py +++ b/other/date_to_weekday.py @@ -1,5 +1,6 @@ from calendar import day_name from datetime import datetime +from typing import Union def date_to_weekday(inp_date: str) -> str: @@ -14,11 +15,12 @@ def date_to_weekday(inp_date: str) -> str: >>> date_to_weekday("1/1/2021") 'Friday' """ + year: Union[int, str] day, month, year = (int(x) for x in inp_date.split("/")) if year % 100 == 0: year = "00" new_base_date: str = f"{day}/{month}/{year%100} 0:0:0" - date_time_obj: datetime.date = datetime.strptime(new_base_date, "%d/%m/%y %H:%M:%S") + date_time_obj: datetime = datetime.strptime(new_base_date, "%d/%m/%y %H:%M:%S") out_put_day: int = date_time_obj.weekday() return day_name[out_put_day] From 4bbe7ab0904213b8c7734b1b8d88835393bc8397 Mon Sep 17 00:00:00 2001 From: Andrew Grangaard Date: Tue, 26 Oct 2021 16:45:02 -0700 Subject: [PATCH 2/6] [mypy] uses future annotation style for other/date_to_weekly --- other/date_to_weekday.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/other/date_to_weekday.py b/other/date_to_weekday.py index 57404da63440..77025d4f5aa3 100644 --- a/other/date_to_weekday.py +++ b/other/date_to_weekday.py @@ -1,6 +1,7 @@ +from __future__ import annotations + from calendar import day_name from datetime import datetime -from typing import Union def date_to_weekday(inp_date: str) -> str: @@ -15,7 +16,7 @@ def date_to_weekday(inp_date: str) -> str: >>> date_to_weekday("1/1/2021") 'Friday' """ - year: Union[int, str] + year: int | str day, month, year = (int(x) for x in inp_date.split("/")) if year % 100 == 0: year = "00" From 4c2425a8d910e263c48e9e8eb84191dd3b6fa1de Mon Sep 17 00:00:00 2001 From: Andrew Grangaard Date: Tue, 26 Oct 2021 20:56:34 -0700 Subject: [PATCH 3/6] date_to_weekday: new implementation replaces buggy original --- other/date_to_weekday.py | 146 +++++++++++++++++++++++++++++++++++---- 1 file changed, 131 insertions(+), 15 deletions(-) diff --git a/other/date_to_weekday.py b/other/date_to_weekday.py index 77025d4f5aa3..b08a62ef4a9a 100644 --- a/other/date_to_weekday.py +++ b/other/date_to_weekday.py @@ -3,28 +3,144 @@ from calendar import day_name from datetime import datetime +""" +Family of functions for calculating the day of week name from a date +""" -def date_to_weekday(inp_date: str) -> str: + +def day_of_week(datetime_obj: datetime) -> str: """ - It returns the day name of the given date string. - :param inp_date: + Calculates the day name of the given datetime object + :param datetime_obj: :return: String - >>> date_to_weekday("7/8/2035") + >>> day_of_week(datetime(year=2035, month=8, day=7)) 'Tuesday' - >>> date_to_weekday("7/8/2021") + >>> day_of_week(datetime(year=2021, month=8, day=7)) 'Saturday' - >>> date_to_weekday("1/1/2021") + >>> day_of_week(datetime(year=2021, month=8, day=1)) + 'Sunday' + >>> day_of_week(datetime(year=2021, month=1, day=1)) 'Friday' + >>> day_of_week(datetime(year=2021, month=1, day=31)) + 'Sunday' + """ + day_of_week: int = datetime_obj.weekday() # Monday = 0 .. Sunday = 6 + return day_name[day_of_week] + + +def day_of_week_fmt(date_string: str, format: str = "%Y%m%d") -> str: """ - year: int | str - day, month, year = (int(x) for x in inp_date.split("/")) - if year % 100 == 0: - year = "00" - new_base_date: str = f"{day}/{month}/{year%100} 0:0:0" - date_time_obj: datetime = datetime.strptime(new_base_date, "%d/%m/%y %H:%M:%S") - out_put_day: int = date_time_obj.weekday() - return day_name[out_put_day] + Calculates the day name of the given date string decoded by format. + + See time.strptime for format parameters. + + :param date_string: date in dd/mm/yyyy format + :param format: strptime compatible date format + :return: String + + >>> day_of_week_fmt("20211026") + 'Tuesday' + >>> day_of_week_fmt("2021/10/26", "%Y/%m/%d") + 'Tuesday' + >>> day_of_week_fmt("2021-10-26", "%Y-%m-%d") + 'Tuesday' + >>> day_of_week_fmt("7/8/2021", "%d/%m/%Y") + 'Saturday' + >>> day_of_week_fmt("7/8/2021", "%m/%d/%Y") + 'Thursday' + """ + datetime_obj = datetime.strptime(date_string, format) + return day_of_week(datetime_obj) + + +def day_of_week_dmy(date_string: str) -> str: + """ + Calculates the day name of the given date string in day/month/year format + + :param datestring: date in dd/mm/yyyy format + :return: String + >>> day_of_week_dmy("7/8/2035") + 'Tuesday' + >>> day_of_week_dmy("7/8/2021") + 'Saturday' + >>> day_of_week_dmy("7/08/2021") + 'Saturday' + >>> day_of_week_dmy("07/8/2021") + 'Saturday' + >>> day_of_week_dmy("07/08/2021") + 'Saturday' + >>> day_of_week_dmy("1/1/2021") + 'Friday' + >>> day_of_week_dmy("31/1/2021") + 'Sunday' + """ + return day_of_week_fmt(date_string, format="%d/%m/%Y") + + +def day_of_week_mdy(date_string: str) -> str: + """ + Calculates the day name of the given date string. + :param date_mdy: date in mm/dd/yyyy format + :return: String + >>> day_of_week_mdy("8/7/2035") + 'Tuesday' + >>> day_of_week_mdy("8/7/2021") + 'Saturday' + >>> day_of_week_mdy("8/07/2021") + 'Saturday' + >>> day_of_week_mdy("1/31/2021") + 'Sunday' + >>> day_of_week_mdy("01/31/2021") + 'Sunday' + """ + return day_of_week_fmt(date_string, format="%m/%d/%Y") + + +def day_of_week_ymd(date_string: str) -> str: + """ + >>> day_of_week_ymd("2035/07/08") + 'Sunday' + >>> day_of_week_ymd("2021/7/8") + 'Thursday' + >>> day_of_week_ymd("2021/1/1") + 'Friday' + """ + return day_of_week_fmt(date_string, format="%Y/%m/%d") if __name__ == "__main__": - print(date_to_weekday("1/1/2021"), end=" ") + print("Tuesday August 7, 2035:\n ", + day_of_week_fmt("7/8/2035", format="%d/%m/%Y"), + day_of_week_fmt("8/07/2035", format="%m/%d/%Y"), + day_of_week_fmt("2035-08-07", format="%Y-%m-%d"), + day_of_week_fmt("20350807"), + day_of_week_dmy("7/8/2035"), + day_of_week_mdy("8/7/2035"), + day_of_week_ymd("2035/08/07")) + + print("Sunday August 7, 2021:\n ", + day_of_week_fmt("7/8/2021", format="%d/%m/%Y"), + day_of_week_fmt("8/07/2021", format="%m/%d/%Y"), + day_of_week_fmt("2021-08-07", format="%Y-%m-%d"), + day_of_week_fmt("20210807"), + day_of_week_dmy("7/8/2021"), + day_of_week_mdy("8/7/2021"), + day_of_week_ymd("2021/08/07")) + + print("Friday January 1, 2021:\n ", + day_of_week_fmt("1/1/2021", format="%d/%m/%Y"), + day_of_week_fmt("1/1/2021", format="%m/%d/%Y"), + day_of_week_fmt("2021-01-01", format="%Y-%m-%d"), + day_of_week_fmt("20210101"), + day_of_week_dmy("1/1/2021"), + day_of_week_mdy("1/1/2021"), + day_of_week_ymd("2021/01/1")) + + print("Friday October 1, 2021:\n ", + day_of_week_fmt("1/10/2021", format="%d/%m/%Y"), + day_of_week_fmt("10/1/2021", format="%m/%d/%Y"), + day_of_week_fmt("2021-10-01", format="%Y-%m-%d"), + day_of_week_fmt("20211001"), + day_of_week_dmy("1/10/2021"), + day_of_week_mdy("10/1/2021"), + day_of_week_ymd("2021/10/01")) From a053227777516bc2dffeefd0fc2ec1b1455196ea Mon Sep 17 00:00:00 2001 From: Andrew Grangaard Date: Tue, 26 Oct 2021 21:04:39 -0700 Subject: [PATCH 4/6] date_to_weekday: add examples from multiple of 100 years --- other/date_to_weekday.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/other/date_to_weekday.py b/other/date_to_weekday.py index b08a62ef4a9a..8df137a422d9 100644 --- a/other/date_to_weekday.py +++ b/other/date_to_weekday.py @@ -23,6 +23,10 @@ def day_of_week(datetime_obj: datetime) -> str: 'Friday' >>> day_of_week(datetime(year=2021, month=1, day=31)) 'Sunday' + >>> day_of_week(datetime(year=1900, month=1, day=1)) + 'Monday' + >>> day_of_week(datetime(year=2000, month=1, day=1)) + 'Saturday' """ day_of_week: int = datetime_obj.weekday() # Monday = 0 .. Sunday = 6 return day_name[day_of_week] @@ -144,3 +148,15 @@ def day_of_week_ymd(date_string: str) -> str: day_of_week_dmy("1/10/2021"), day_of_week_mdy("10/1/2021"), day_of_week_ymd("2021/10/01")) + + print("Monday January 1, 1900: \n ", + day_of_week_fmt("19000101"), + day_of_week_dmy("1/1/1900"), + day_of_week_mdy("1/1/1900"), + day_of_week_ymd("1900/1/01")) + + print("Saturday January 1, 2000: \n ", + day_of_week_fmt("20000101"), + day_of_week_dmy("1/1/2000"), + day_of_week_mdy("1/1/2000"), + day_of_week_ymd("2000/1/01")) From b9fee1449ee0a6a1f1f7a00dd15dcf1c8d8df246 Mon Sep 17 00:00:00 2001 From: Andrew Grangaard Date: Tue, 26 Oct 2021 23:52:55 -0700 Subject: [PATCH 5/6] clean-up: runs `black` to fix formatting --- other/date_to_weekday.py | 106 ++++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 47 deletions(-) diff --git a/other/date_to_weekday.py b/other/date_to_weekday.py index 8df137a422d9..e709e3a93bad 100644 --- a/other/date_to_weekday.py +++ b/other/date_to_weekday.py @@ -113,50 +113,62 @@ def day_of_week_ymd(date_string: str) -> str: if __name__ == "__main__": - print("Tuesday August 7, 2035:\n ", - day_of_week_fmt("7/8/2035", format="%d/%m/%Y"), - day_of_week_fmt("8/07/2035", format="%m/%d/%Y"), - day_of_week_fmt("2035-08-07", format="%Y-%m-%d"), - day_of_week_fmt("20350807"), - day_of_week_dmy("7/8/2035"), - day_of_week_mdy("8/7/2035"), - day_of_week_ymd("2035/08/07")) - - print("Sunday August 7, 2021:\n ", - day_of_week_fmt("7/8/2021", format="%d/%m/%Y"), - day_of_week_fmt("8/07/2021", format="%m/%d/%Y"), - day_of_week_fmt("2021-08-07", format="%Y-%m-%d"), - day_of_week_fmt("20210807"), - day_of_week_dmy("7/8/2021"), - day_of_week_mdy("8/7/2021"), - day_of_week_ymd("2021/08/07")) - - print("Friday January 1, 2021:\n ", - day_of_week_fmt("1/1/2021", format="%d/%m/%Y"), - day_of_week_fmt("1/1/2021", format="%m/%d/%Y"), - day_of_week_fmt("2021-01-01", format="%Y-%m-%d"), - day_of_week_fmt("20210101"), - day_of_week_dmy("1/1/2021"), - day_of_week_mdy("1/1/2021"), - day_of_week_ymd("2021/01/1")) - - print("Friday October 1, 2021:\n ", - day_of_week_fmt("1/10/2021", format="%d/%m/%Y"), - day_of_week_fmt("10/1/2021", format="%m/%d/%Y"), - day_of_week_fmt("2021-10-01", format="%Y-%m-%d"), - day_of_week_fmt("20211001"), - day_of_week_dmy("1/10/2021"), - day_of_week_mdy("10/1/2021"), - day_of_week_ymd("2021/10/01")) - - print("Monday January 1, 1900: \n ", - day_of_week_fmt("19000101"), - day_of_week_dmy("1/1/1900"), - day_of_week_mdy("1/1/1900"), - day_of_week_ymd("1900/1/01")) - - print("Saturday January 1, 2000: \n ", - day_of_week_fmt("20000101"), - day_of_week_dmy("1/1/2000"), - day_of_week_mdy("1/1/2000"), - day_of_week_ymd("2000/1/01")) + print( + "Tuesday August 7, 2035:\n ", + day_of_week_fmt("7/8/2035", format="%d/%m/%Y"), + day_of_week_fmt("8/07/2035", format="%m/%d/%Y"), + day_of_week_fmt("2035-08-07", format="%Y-%m-%d"), + day_of_week_fmt("20350807"), + day_of_week_dmy("7/8/2035"), + day_of_week_mdy("8/7/2035"), + day_of_week_ymd("2035/08/07"), + ) + + print( + "Sunday August 7, 2021:\n ", + day_of_week_fmt("7/8/2021", format="%d/%m/%Y"), + day_of_week_fmt("8/07/2021", format="%m/%d/%Y"), + day_of_week_fmt("2021-08-07", format="%Y-%m-%d"), + day_of_week_fmt("20210807"), + day_of_week_dmy("7/8/2021"), + day_of_week_mdy("8/7/2021"), + day_of_week_ymd("2021/08/07"), + ) + + print( + "Friday January 1, 2021:\n ", + day_of_week_fmt("1/1/2021", format="%d/%m/%Y"), + day_of_week_fmt("1/1/2021", format="%m/%d/%Y"), + day_of_week_fmt("2021-01-01", format="%Y-%m-%d"), + day_of_week_fmt("20210101"), + day_of_week_dmy("1/1/2021"), + day_of_week_mdy("1/1/2021"), + day_of_week_ymd("2021/01/1"), + ) + + print( + "Friday October 1, 2021:\n ", + day_of_week_fmt("1/10/2021", format="%d/%m/%Y"), + day_of_week_fmt("10/1/2021", format="%m/%d/%Y"), + day_of_week_fmt("2021-10-01", format="%Y-%m-%d"), + day_of_week_fmt("20211001"), + day_of_week_dmy("1/10/2021"), + day_of_week_mdy("10/1/2021"), + day_of_week_ymd("2021/10/01"), + ) + + print( + "Monday January 1, 1900: \n ", + day_of_week_fmt("19000101"), + day_of_week_dmy("1/1/1900"), + day_of_week_mdy("1/1/1900"), + day_of_week_ymd("1900/1/01"), + ) + + print( + "Saturday January 1, 2000: \n ", + day_of_week_fmt("20000101"), + day_of_week_dmy("1/1/2000"), + day_of_week_mdy("1/1/2000"), + day_of_week_ymd("2000/1/01"), + ) From 7f8f2e30b9a57ddd9ce8a335ae514bea7595dca5 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Fri, 29 Oct 2021 09:20:26 +0200 Subject: [PATCH 6/6] Delete date_to_weekday.py --- other/date_to_weekday.py | 174 --------------------------------------- 1 file changed, 174 deletions(-) delete mode 100644 other/date_to_weekday.py diff --git a/other/date_to_weekday.py b/other/date_to_weekday.py deleted file mode 100644 index e709e3a93bad..000000000000 --- a/other/date_to_weekday.py +++ /dev/null @@ -1,174 +0,0 @@ -from __future__ import annotations - -from calendar import day_name -from datetime import datetime - -""" -Family of functions for calculating the day of week name from a date -""" - - -def day_of_week(datetime_obj: datetime) -> str: - """ - Calculates the day name of the given datetime object - :param datetime_obj: - :return: String - >>> day_of_week(datetime(year=2035, month=8, day=7)) - 'Tuesday' - >>> day_of_week(datetime(year=2021, month=8, day=7)) - 'Saturday' - >>> day_of_week(datetime(year=2021, month=8, day=1)) - 'Sunday' - >>> day_of_week(datetime(year=2021, month=1, day=1)) - 'Friday' - >>> day_of_week(datetime(year=2021, month=1, day=31)) - 'Sunday' - >>> day_of_week(datetime(year=1900, month=1, day=1)) - 'Monday' - >>> day_of_week(datetime(year=2000, month=1, day=1)) - 'Saturday' - """ - day_of_week: int = datetime_obj.weekday() # Monday = 0 .. Sunday = 6 - return day_name[day_of_week] - - -def day_of_week_fmt(date_string: str, format: str = "%Y%m%d") -> str: - """ - Calculates the day name of the given date string decoded by format. - - See time.strptime for format parameters. - - :param date_string: date in dd/mm/yyyy format - :param format: strptime compatible date format - :return: String - - >>> day_of_week_fmt("20211026") - 'Tuesday' - >>> day_of_week_fmt("2021/10/26", "%Y/%m/%d") - 'Tuesday' - >>> day_of_week_fmt("2021-10-26", "%Y-%m-%d") - 'Tuesday' - >>> day_of_week_fmt("7/8/2021", "%d/%m/%Y") - 'Saturday' - >>> day_of_week_fmt("7/8/2021", "%m/%d/%Y") - 'Thursday' - """ - datetime_obj = datetime.strptime(date_string, format) - return day_of_week(datetime_obj) - - -def day_of_week_dmy(date_string: str) -> str: - """ - Calculates the day name of the given date string in day/month/year format - - :param datestring: date in dd/mm/yyyy format - :return: String - >>> day_of_week_dmy("7/8/2035") - 'Tuesday' - >>> day_of_week_dmy("7/8/2021") - 'Saturday' - >>> day_of_week_dmy("7/08/2021") - 'Saturday' - >>> day_of_week_dmy("07/8/2021") - 'Saturday' - >>> day_of_week_dmy("07/08/2021") - 'Saturday' - >>> day_of_week_dmy("1/1/2021") - 'Friday' - >>> day_of_week_dmy("31/1/2021") - 'Sunday' - """ - return day_of_week_fmt(date_string, format="%d/%m/%Y") - - -def day_of_week_mdy(date_string: str) -> str: - """ - Calculates the day name of the given date string. - :param date_mdy: date in mm/dd/yyyy format - :return: String - >>> day_of_week_mdy("8/7/2035") - 'Tuesday' - >>> day_of_week_mdy("8/7/2021") - 'Saturday' - >>> day_of_week_mdy("8/07/2021") - 'Saturday' - >>> day_of_week_mdy("1/31/2021") - 'Sunday' - >>> day_of_week_mdy("01/31/2021") - 'Sunday' - """ - return day_of_week_fmt(date_string, format="%m/%d/%Y") - - -def day_of_week_ymd(date_string: str) -> str: - """ - >>> day_of_week_ymd("2035/07/08") - 'Sunday' - >>> day_of_week_ymd("2021/7/8") - 'Thursday' - >>> day_of_week_ymd("2021/1/1") - 'Friday' - """ - return day_of_week_fmt(date_string, format="%Y/%m/%d") - - -if __name__ == "__main__": - print( - "Tuesday August 7, 2035:\n ", - day_of_week_fmt("7/8/2035", format="%d/%m/%Y"), - day_of_week_fmt("8/07/2035", format="%m/%d/%Y"), - day_of_week_fmt("2035-08-07", format="%Y-%m-%d"), - day_of_week_fmt("20350807"), - day_of_week_dmy("7/8/2035"), - day_of_week_mdy("8/7/2035"), - day_of_week_ymd("2035/08/07"), - ) - - print( - "Sunday August 7, 2021:\n ", - day_of_week_fmt("7/8/2021", format="%d/%m/%Y"), - day_of_week_fmt("8/07/2021", format="%m/%d/%Y"), - day_of_week_fmt("2021-08-07", format="%Y-%m-%d"), - day_of_week_fmt("20210807"), - day_of_week_dmy("7/8/2021"), - day_of_week_mdy("8/7/2021"), - day_of_week_ymd("2021/08/07"), - ) - - print( - "Friday January 1, 2021:\n ", - day_of_week_fmt("1/1/2021", format="%d/%m/%Y"), - day_of_week_fmt("1/1/2021", format="%m/%d/%Y"), - day_of_week_fmt("2021-01-01", format="%Y-%m-%d"), - day_of_week_fmt("20210101"), - day_of_week_dmy("1/1/2021"), - day_of_week_mdy("1/1/2021"), - day_of_week_ymd("2021/01/1"), - ) - - print( - "Friday October 1, 2021:\n ", - day_of_week_fmt("1/10/2021", format="%d/%m/%Y"), - day_of_week_fmt("10/1/2021", format="%m/%d/%Y"), - day_of_week_fmt("2021-10-01", format="%Y-%m-%d"), - day_of_week_fmt("20211001"), - day_of_week_dmy("1/10/2021"), - day_of_week_mdy("10/1/2021"), - day_of_week_ymd("2021/10/01"), - ) - - print( - "Monday January 1, 1900: \n ", - day_of_week_fmt("19000101"), - day_of_week_dmy("1/1/1900"), - day_of_week_mdy("1/1/1900"), - day_of_week_ymd("1900/1/01"), - ) - - print( - "Saturday January 1, 2000: \n ", - day_of_week_fmt("20000101"), - day_of_week_dmy("1/1/2000"), - day_of_week_mdy("1/1/2000"), - day_of_week_ymd("2000/1/01"), - )