-
Notifications
You must be signed in to change notification settings - Fork 0
/
Date.py
212 lines (129 loc) · 4.67 KB
/
Date.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
from dateutil import parser
import pandas as pd
from datetime import datetime
import abc
from datetime import timedelta
import dateutil.relativedelta as relativedelta
class Date(abc.ABC):
def check_date_string(self, input_string: str) -> bool:
"""
This function checks if the input string contains a date or not
Parameters
----------
input_string: str
Any str
Outputs
-------
bool: returns if the input string contains a date
"""
flag = True
try:
flag = bool(parser.parse(input_string, fuzzy=True, dayfirst=True))
except ValueError:
flag = False
return flag
def extract_date_within_string(self, input_string: str) -> datetime:
"""
This function extracts a date if the input string contains a recognizable date
Parameters
----------
input_string: str
Any str
Outputs
-------
datetime object: returns the datetime object if a recognizable date is present
within the input string
None: when there is no recognizable date in the input string
"""
date = None
try:
date = parser.parse(input_string, fuzzy=True, dayfirst=True)
except ValueError:
date = None
return date
def find_recent_datetime(self, datetimes: list[datetime]) -> datetime:
"""
Given a list of datetime objects, return the most recent.
parameters
----------
datetimes: list[Datetime]
Outputs
-------
datetime: most recent date in datetime format
"""
most_recent_datetime = max(datetimes)
return most_recent_datetime
def find_oldest_datetime(self, datetimes: list[datetime]) -> datetime:
"""
Given a list of datetime objects, return the oldest date.
parameters
----------
datetimes: list[Datetime]
Outputs
-------
datetime: most oldest date in datetime format
"""
oldest_datetime = min(datetimes)
return oldest_datetime
def str_to_date(self, date_str: str, str_in_format: str) -> datetime:
"""
Given a string converts it into datetime format
parameters
----------
date_string: str
date in string format
Outputs
-------
datetime: date as datetime object
"""
date_out = datetime.strptime(date_str, str_in_format)
return date_out
def date_to_str(self, date_datetime: datetime, date_in_format: str) -> str:
"""
Given a datetime object converts it into string format
parameters
----------
date_datetime: datetime
date as datetime object
str_in_format: str
format of the input date
Outputs
-------
str : date in string format
"""
str_out = date_datetime.strftime(date_in_format)
return str_out
def generate_dates(self, start_date: str, end_date: str, **Kwargs) -> list[datetime]:
"""
Given start, end datetime object and relative time delta duration,
generates dates between start and end dates.
parameters
----------
start_date: datetime
start date as datetime object
end_date: datetime
end date as datetime object
Kwargs: relative time delta arguments
Documentation: https://dateutil.readthedocs.io/en/stable/relativedelta.html
Need to use the plural arguments: years,months,days
e.g years=+1 to add 1 year to start date
months=+1 to add 1 month to start date
days=+1 to add 1 day to start date
Outputs
-------
list[datetime] : list of datetimes between the start and end dates
"""
if len(Kwargs.values()) == 0:
raise ValueError("Need to specify additional arguments for relative delta function")
s_date = self.str_to_date(start_date, '%d-%m-%Y')
e_date = self.str_to_date(end_date, '%d-%m-%Y')
print(s_date, e_date)
date_list = []
if s_date > e_date:
raise ValueError("Start date is beyond end date")
else:
current_date = s_date + relativedelta.relativedelta(**Kwargs)
while current_date < e_date:
date_list.append(current_date)
current_date = current_date + relativedelta.relativedelta(**Kwargs)
return date_list