Skip to content

Commit

Permalink
Add additional functions for working with dekads.
Browse files Browse the repository at this point in the history
  • Loading branch information
Christoph Paulik committed Jul 10, 2017
1 parent df3fa2b commit f29fa20
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 0 deletions.
4 changes: 4 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# v0.6.5, 2017-07-10

* Add additonal functions for working with dekads.

# v0.6.4, 2017-06-02

* Refactor resampling routine to be more modular and better usable outside of pytesmo.
Expand Down
73 changes: 73 additions & 0 deletions pytesmo/timedate/dekad.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,79 @@ def check_dekad(date):
return new_date


def dekad_startdate_from_date(dt_in):
"""
dekadal startdate that a date falls in
Parameters
----------
run_dt: datetime.datetime
Returns
-------
startdate: datetime.datetime
startdate of dekad
"""
if dt_in.day <= 10:
startdate = datetime(dt_in.year,
dt_in.month,
1, 0, 0, 0)
if dt_in.day >= 11 and dt_in.day <= 20:
startdate = datetime(dt_in.year,
dt_in.month,
11, 0, 0, 0)
if dt_in.day >= 21:
startdate = datetime(dt_in.year,
dt_in.month,
21, 0, 0, 0)
return startdate


def check_dekad_enddate(dt):
"""
Check if a date is a dekad enddate
"""
return check_dekad(dt) == dt


def check_dekad_startdate(dt):
"""
Check if a date is a dekad startdate
"""
if dt.day in [1, 11, 21]:
return True
else:
return False


def group_into_dekads(dates, use_dekad_startdate=False):
"""
Group a list of dates into dekads.
Parameters
----------
dates: list of datetime.datetime
use_dekad_startdates: boolean, optional
If set the dekad reference dates will
be the startdates of the dekad
Returns
-------
groups: dict
keys: dekad reference dates
values: list of dates belonging to dekad
"""
groups = {}
for dt in dates:
dekad_date = check_dekad(dt)
if use_dekad_startdate:
dekad_date = dekad_startdate_from_date(dekad_date)
if dekad_date not in groups:
groups[dekad_date] = []
groups[dekad_date].append(dt)
return groups


def dekad2day(year, month, dekad):
"""Gets the day of a dekad.
Expand Down
42 changes: 42 additions & 0 deletions tests/test_timedate/test_dekad.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,48 @@ def test_get_dekad_period(self):
def test_runningdekad2date(self):
assert dk.runningdekad2date(2014, 35) == datetime(2014, 12, 20)


def test_check_dekad_startdate():
assert dk.check_dekad_startdate(datetime(2000, 1, 1))
assert dk.check_dekad_startdate(datetime(2000, 1, 11))
assert dk.check_dekad_startdate(datetime(2000, 1, 21))
assert not dk.check_dekad_startdate(datetime(2000, 1, 22))


def test_check_dekad_enddate():
assert dk.check_dekad_enddate(datetime(2000, 1, 10))
assert dk.check_dekad_enddate(datetime(2000, 1, 20))
assert dk.check_dekad_enddate(datetime(2000, 1, 31))
assert dk.check_dekad_enddate(datetime(2000, 2, 29))
assert not dk.check_dekad_enddate(datetime(2000, 2, 28))


def test_dekad_startdate_from_date():
assert datetime(2000, 1, 1) == dk.dekad_startdate_from_date(
datetime(2000, 1, 10))
assert datetime(2000, 2, 21) == dk.dekad_startdate_from_date(
datetime(2000, 2, 29))
assert datetime(2000, 2, 11) == dk.dekad_startdate_from_date(
datetime(2000, 2, 17))


def test_group_into_dekads():
dtimes = [datetime(2000, 1, 10),
datetime(2000, 1, 11),
datetime(2000, 1, 12),
datetime(2000, 1, 23)]
groups = dk.group_into_dekads(dtimes)
assert groups == {datetime(2000, 1, 10): [datetime(2000, 1, 10)],
datetime(2000, 1, 20): [datetime(2000, 1, 11),
datetime(2000, 1, 12)],
datetime(2000, 1, 31): [datetime(2000, 1, 23)]}
groups = dk.group_into_dekads(dtimes,
use_dekad_startdate=True)
assert groups == {datetime(2000, 1, 1): [datetime(2000, 1, 10)],
datetime(2000, 1, 11): [datetime(2000, 1, 11),
datetime(2000, 1, 12)],
datetime(2000, 1, 21): [datetime(2000, 1, 23)]}

if __name__ == "__main__":
# import sys;sys.argv = ['', 'Test.testName']
unittest.main()

0 comments on commit f29fa20

Please sign in to comment.