Mulling over a search feed that includes date range limits, I had a quick look for a python library that includes “natural language” functions for describing different date ranges. Not finding anything offhand, I popped some quick starter-for-ten functions up at this gist, which should also be embedded below.
It includes things like today(), tomorrow(), last_week(), later_this_month() and so on.
If you know of a “proper” library that does this, please let me know via the comments…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import datetime | |
from dateutil.relativedelta import relativedelta | |
def today(date=None,iso=False): | |
if date is None: date=datetime.date.today() | |
if iso: return date.isoformat() | |
else: return date | |
def yesterday(date=None,iso=False): | |
if date is None: date=today() | |
yesterday = date.today() – relativedelta(days=1) | |
if iso: return yesterday.isoformat() | |
return yesterday | |
def tomorrow(date=None,iso=False): | |
if date is None: date=today() | |
tomorrow=date.today() + relativedelta(days=1) | |
if iso: return tomorrow.isoformat() | |
return tomorrow | |
def last_week(date=None,daterange=True,iso=False): | |
if date is None: date=today() | |
start_date = date + relativedelta(days=–date.weekday(), weeks=–1) | |
end_date = start_date + relativedelta(days=6) | |
if daterange: | |
if iso: return start_date.isoformat(),end_date.isoformat() | |
else: return start_date, end_date | |
def this_week(date=None,daterange=True,iso=False): | |
if date is None: date=today() | |
start_date = date + relativedelta(days=–date.weekday()) | |
end_date = start_date + relativedelta(days=6) | |
if daterange: | |
if iso: | |
return start_date.isoformat(), end_date.isoformat() | |
else: | |
return start_date, end_date | |
def next_week(date=None,daterange=True,iso=False): | |
if date is None: date=today() | |
start_date = date + relativedelta(days=–date.weekday(), weeks=1) | |
end_date = start_date + relativedelta(days=6) | |
if daterange: | |
if iso: | |
return start_date.isoformat(), end_date.isoformat() | |
else: | |
return start_date, end_date | |
def later_this_week(date=None,incl=False,daterange=True,iso=False): | |
date=today(date) | |
start_date, end_date = this_week(date) | |
if not incl: start_date=tomorrow(date) | |
else: start_date=today(date) | |
#Really need to check if today is last day of week? | |
if daterange: | |
if iso: | |
return start_date.isoformat(), end_date.isoformat() | |
else: | |
return start_date, end_date | |
def earlier_this_week(date=None,incl=False,daterange=True,iso=False): | |
date=today(date) | |
start_date, end_date = this_week(date) | |
if not incl: end_date=yesterday(date) | |
else: end_date=today(date) | |
#Really need to check if today is first day of week? | |
if daterange: | |
if iso: | |
return start_date.isoformat(), end_date.isoformat() | |
else: | |
return start_date, end_date | |
def last_month(date=None,daterange=True,iso=False): | |
if date is None: date=today() | |
end_date = date.replace(day=1)– relativedelta(days=1) | |
start_date = end_date.replace(day=1) | |
if daterange: | |
if iso: return start_date.isoformat(),end_date.isoformat() | |
else: return start_date, end_date | |
def next_month(date=None,daterange=True,iso=False): | |
if date is None: date=today() | |
end_date = date+ relativedelta(months=2) | |
end_date=end_date.replace(day=1)– relativedelta(days=1) | |
start_date = end_date.replace(day=1) | |
if daterange: | |
if iso: return start_date.isoformat(),end_date.isoformat() | |
else: return start_date, end_date | |
def this_month(date=None,daterange=True,iso=False): | |
if date is None: date=today() | |
end_date = next_month(date)[0]– relativedelta(days=1) | |
start_date = end_date.replace(day=1) | |
if daterange: | |
if iso: return start_date.isoformat(),end_date.isoformat() | |
else: return start_date, end_date | |
def earlier_this_month(date=None,incl=False,daterange=True,iso=False): | |
if date is None: date=today() | |
start_date, end_date = this_month(date) | |
if not incl: end_date=yesterday(date) | |
else: end_date=today(date) | |
#Really need to check if today is first day of month? | |
if daterange: | |
if iso: | |
return start_date.isoformat(), end_date.isoformat() | |
else: | |
return start_date, end_date | |
def later_this_month(date=None,incl=False,daterange=True,iso=False): | |
if date is None: date=today() | |
start_date, end_date = this_month(date) | |
if not incl: start_date=tomorrow(date) | |
else: start_date=today(date) | |
#Really need to check if today is last day of month? | |
if daterange: | |
if iso: | |
return start_date.isoformat(), end_date.isoformat() | |
else: | |
return start_date, end_date | |
#via http://stackoverflow.com/a/2384407/454773 | |
MON, TUE, WED, THU, FRI, SAT, SUN = range(7) | |
def day_lastweek(day=MON,date=None,iso=False): | |
if date is None: date=today() | |
qday= last_week()[0] + relativedelta(days=day) | |
if iso: return qday.isoformat() | |
return qday | |
def day_thisweek(day=MON,date=None,iso=False): | |
if date is None: date=today() | |
qday= this_week()[0] + relativedelta(days=day) | |
if iso: return qday.isoformat() | |
return qday | |
def day_nextweek(day=MON,date=None,iso=False): | |
if date is None: date=today() | |
qday= next_week()[0] + relativedelta(days=day) | |
if iso: return qday.isoformat() | |
return qday |
UPDATE: code repo here: https://github.com/psychemedia/python-natural-time-periods
SEE ALSO: https://github.com/DavidAmison/natural_time
PS more handy fragments:
#http://stackoverflow.com/a/28290050/454773 #Get month and year between two dates import datetime from dateutil.rrule import rrule, MONTHLY strt_dt = datetime.date(2015,4,1) end_dt = datetime.date(2016,10,1) dates = ['_'.join([dt.strftime('%B').lower(), dt.strftime('%Y')]) for dt in rrule(MONTHLY, dtstart=strt_dt, until=end_dt)]