/
Date.py
141 lines (113 loc) · 4.77 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
#!/usr/bin/python3
import datetime
from dateutil.rrule import rrule, MONTHLY
from dateutil.relativedelta import relativedelta
def convert_date_str_to_datetime(date_str):
res = datetime.date(int(date_str[0:4]), int(date_str[4:6]), int(date_str[6:8]))
return res
def get_full_month_str(date_from, date_to):
# add one day (if last day of the month)
date_to = date_to + relativedelta(days=+1)
full_month = [dt for dt in rrule(MONTHLY, bymonthday=1,dtstart=date_from, until=date_to)]
# remove last_month (incomplete)
if len(full_month):
full_month = full_month[:-1]
return full_month
def get_date_range_full_month_and_days(date_from, date_to):
date_from = convert_date_str_to_datetime(date_from)
date_to = convert_date_str_to_datetime(date_to)
full_month = get_full_month_str(date_from, date_to)
# request at least one month
if full_month:
day_list = substract_date(date_from.strftime('%Y%m%d'), full_month[0].strftime('%Y%m%d'))
# remove last day (day in full moth)
if day_list:
day_list = day_list[:-1]
day_list.extend(substract_date( (full_month[-1] + relativedelta(months=+1) ).strftime('%Y%m%d'), date_to.strftime('%Y%m%d')))
else:
day_list = substract_date(date_from.strftime('%Y%m%d'), date_to.strftime('%Y%m%d'))
full_month = [dt_month.strftime('%Y%m') for dt_month in full_month]
return day_list, full_month
# # TODO: refractor me
class Date(object):
"""docstring for Date"""
def __init__(self, *args):
if len(args) == 3:
self.year = str(args[0])
self.month = str(args[1])
self.day = str(args[2]).zfill(2)
if len(args) == 1:
self.year = str(args[0])[:4]
self.month = str(args[0])[4:6]
self.day = str(args[0])[6:]
def __str__(self):
return "{0}{1}{2}".format(self.year, self.month, self.day)
def _get_year(self):
return self.year
def _get_month(self):
return self.month
def _get_day(self):
return self.day
def _set_year(self, year):
self.year = year
def _set_month(self, month):
self.month = month
def _set_day(self, day):
self.day = day
def substract_day(self, numDay):
computed_date = datetime.date(int(self.year), int(self.month), int(self.day)) - datetime.timedelta(numDay)
comp_year = str(computed_date.year)
comp_month = str(computed_date.month).zfill(2)
comp_day = str(computed_date.day).zfill(2)
return comp_year + comp_month + comp_day
def get_today_date_str():
return datetime.date.today().strftime("%Y%m%d")
def date_add_day(date, num_day=1):
new_date = datetime.date(int(date[0:4]), int(date[4:6]), int(date[6:8])) + datetime.timedelta(num_day)
new_date = str(new_date).replace('-', '')
return new_date
def date_substract_day(date, num_day=1):
new_date = datetime.date(int(date[0:4]), int(date[4:6]), int(date[6:8])) - datetime.timedelta(num_day)
new_date = str(new_date).replace('-', '')
return new_date
# # TODO: remove me ## FIXME:
def get_date_range(num_day):
curr_date = datetime.date.today()
date = Date(str(curr_date.year)+str(curr_date.month).zfill(2)+str(curr_date.day).zfill(2))
date_list = []
for i in range(0, num_day+1):
date_list.append(date.substract_day(i))
return list(reversed(date_list))
def get_previous_date_list(num_day):
curr_date = datetime.date.today()
date = Date(str(curr_date.year)+str(curr_date.month).zfill(2)+str(curr_date.day).zfill(2))
date_list = []
for i in range(0, num_day+1):
date_list.append(date.substract_day(i))
return list(reversed(date_list))
def substract_date(date_from, date_to):
date_from = datetime.date(int(date_from[0:4]), int(date_from[4:6]), int(date_from[6:8]))
date_to = datetime.date(int(date_to[0:4]), int(date_to[4:6]), int(date_to[6:8]))
delta = date_to - date_from # timedelta
l_date = []
for i in range(delta.days + 1):
date = date_from + datetime.timedelta(i)
l_date.append( date.strftime('%Y%m%d') )
return l_date
def validate_str_date(str_date, separator=''):
try:
datetime.datetime.strptime(str_date, '%Y{}%m{}%d'.format(separator, separator))
return True
except ValueError:
return False
def sanitise_date_range(date_from, date_to, separator=''):
'''
Check/Return a correct date_form and date_to
'''
if not validate_str_date(date_from, separator=separator):
date_from = datetime.date.today().strftime("%Y%m%d")
if not validate_str_date(date_to, separator=separator):
date_to = datetime.date.today().strftime("%Y%m%d")
if int(date_from) > int(date_to):
date_from = date_to
return {"date_from": date_from, "date_to": date_to}