Repository: pyjanitor-devs/pyjanitor

Issue:
Add filter_date function
This issue is to track creating a `filter_date` function, or whatever else you might want to call it.

The main idea is that even though there are already `filter` functions, date filtering is a bit more complex. For example, when filtering strings you can just write a string, but for dates it usually needs to be a `date` or `datetime` object, and not all of them play together nicely.

More important than the above is that when filtering a range, the lines can get really long, like so:

```python
start_date = date(2017, 1, 1)
end_date = date(2018, 1, 1)
df = df[(df.date_column >= start_date) & (df.date_column <= end_date)]
```

I think something like the following is nicer:

```python
df = df.filter_date('date_column', start='2018-01-01', end='2018-01-01')
```
It could also include arguments for `year`, `years`, etc.








Discussion:

Resolving patch:
diff --git a/janitor/functions.py b/janitor/functions.py
--- a/janitor/functions.py
+++ b/janitor/functions.py
@@ -4,12 +4,13 @@
 import datetime as dt
 import re
 from functools import partial, reduce
-from typing import List, Union
+from typing import List, Union, Dict
 
 import numpy as np
 import pandas as pd
 import pandas_flavor as pf
 from scipy.stats import mode
+import warnings
 from sklearn.preprocessing import LabelEncoder
 
 from .errors import JanitorError
@@ -836,6 +837,234 @@ def filter_on(df, criteria, complement=False):
         return df.query(criteria)
 
 
+@pf.register_dataframe_method
+def filter_date(
+    df: pd.DataFrame,
+    column: str,
+    start: dt.date = None,
+    end: dt.date = None,
+    years: List = None,
+    months: List = None,
+    days: List = None,
+    column_date_options: Dict = None,
+    format: str = None,
+):
+    """
+    :Description:
+
+    Filter a date-based column based on certain criteria
+
+    Dates may be finicky and this function builds on top of the "magic" from
+    the pandas `to_datetime` function that is able to parse dates well.
+
+    Additional options to parse the date type of your column may be found at
+    the official pandas documentation:
+
+    pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html
+
+    **Note:** This method will cast your column to a Timestamp!
+
+    :param df: A pandas dataframe.
+    :param column: The column which to apply the fraction transformation.
+    :param start: The beginning date to use to filter the DataFrame.
+    :param end: The end date to use to filter the DataFrame.
+    :param years: The years to use to filter the DataFrame.
+    :param months: The months to use to filter the DataFrame.
+    :param days: The days to use to filter the DataFrame.
+    :param column_date_options: 'Special options to use when parsing the date\
+    column in the original DataFrame. The options may be found at the official\
+    Pandas documentation.'
+    :param format: 'It you're using a format for start or end that is not\
+    recognized natively by pandas' to_datetime function, you may supply the\
+    format yourself. Python date and time formats may be found at\
+    http://strftime.org/.'
+
+    **Note:** This only affects the format of the `start` and `end` parameters.
+     If there's an issue with the format of the DataFrame being parsed, you
+     would pass `{'format': your_format}` to `column_date_options`.
+
+    :Setup:
+
+    .. code-block:: python
+
+        import pandas as pd
+        import janitor
+
+        date_list = [
+            [1, "01/28/19"], [2, "01/29/19"], [3, "01/30/19"],
+            [4, "01/31/19"], [5, "02/01/19"], [6, "02/02/19"],
+            [7, "02/03/19"], [8, "02/04/19"], [9, "02/05/19"],
+            [10, "02/06/19"], [11, "02/07/20"], [12, "02/08/20"],
+            [13, "02/09/20"], [14, "02/10/20"], [15, "02/11/20"],
+            [16, "02/12/20"], [17, "02/07/20"], [18, "02/08/20"],
+            [19, "02/09/20"], [20, "02/10/20"], [21, "02/11/20"],
+            [22, "02/12/20"], [23, "03/08/20"], [24, "03/09/20"],
+            [25, "03/10/20"], [26, "03/11/20"], [27, "03/12/20"]]
+
+        example_dataframe = pd.DataFrame(date_list,
+                                         columns = ['AMOUNT', 'DATE'])
+
+
+    :Example 1: Filter dataframe between two dates
+
+    .. code-block:: python
+
+        start = "01/29/19"
+        end = "01/30/19"
+
+        example_dataframe.filter_date('DATE', start=start, end=end)
+
+
+    :Output:
+
+    .. code-block:: python
+
+           AMOUNT       DATE
+        1       2 2019-01-29
+        2       3 2019-01-30
+
+    :Example 2: Using a different date format for filtering
+
+    .. code-block:: python
+
+        end = "01$$$30$$$19"
+        format = "%m$$$%d$$$%y"
+
+        example_dataframe.filter_date('DATE', end=end, format=format)
+
+
+    :Output:
+
+    .. code-block:: python
+
+           AMOUNT       DATE
+        0       1 2019-01-28
+        1       2 2019-01-29
+        2       3 2019-01-30
+
+    :Example 3: Filtering by year
+
+    .. code-block:: python
+
+        years = [2019]
+
+        example_dataframe.filter_date('DATE', years=years)
+
+
+    :Output:
+
+    .. code-block:: python
+
+
+           AMOUNT       DATE
+        0       1 2019-01-28
+        1       2 2019-01-29
+        2       3 2019-01-30
+        3       4 2019-01-31
+        4       5 2019-02-01
+        5       6 2019-02-02
+        6       7 2019-02-03
+        7       8 2019-02-04
+        8       9 2019-02-05
+        9      10 2019-02-06
+
+    :Example 4: Filtering by year and month
+
+    .. code-block:: python
+
+        years = [2020]
+        months = [3]
+
+        example_dataframe.filter_date('DATE', years=years, months=months)
+
+
+    :Output:
+
+    .. code-block:: python
+
+            AMOUNT       DATE
+        22      23 2020-03-08
+        23      24 2020-03-09
+        24      25 2020-03-10
+        25      26 2020-03-11
+        26      27 2020-03-12
+
+    :Example 5: Filtering by year and day
+
+    .. code-block:: python
+
+        years = [2020]
+        days = range(10,12)
+
+        example_dataframe.filter_date('DATE', years=years, days=days)
+
+
+    :Output:
+
+    .. code-block:: python
+
+            AMOUNT       DATE
+        13      14 2020-02-10
+        14      15 2020-02-11
+        19      20 2020-02-10
+        20      21 2020-02-11
+        24      25 2020-03-10
+        25      26 2020-03-11
+    """
+
+    check("column", column, [str])
+
+    def _date_filter_conditions(conditions):
+        """
+        Taken from: https://stackoverflow.com/a/13616382
+        """
+        return reduce(np.logical_and, conditions)
+
+    def _get_year(x):
+        return x.year
+
+    def _get_month(x):
+        return x.month
+
+    def _get_day(x):
+        return x.day
+
+    if column_date_options:
+        df.loc[:, column] = pd.to_datetime(
+            df.loc[:, column], **column_date_options
+        )
+    else:
+        df.loc[:, column] = pd.to_datetime(df.loc[:, column])
+
+    _filter_list = []
+
+    if start:
+        start_date = pd.to_datetime(start, format=format)
+        _filter_list.append(df.loc[:, column] >= start_date)
+
+    if end:
+        end_date = pd.to_datetime(end, format=format)
+        _filter_list.append(df.loc[:, column] <= end_date)
+
+    if years:
+        _filter_list.append(df.loc[:, column].apply(_get_year).isin(years))
+
+    if months:
+        _filter_list.append(df.loc[:, column].apply(_get_month).isin(months))
+
+    if days:
+        _filter_list.append(df.loc[:, column].apply(_get_day).isin(days))
+
+    if start and end:
+        if start_date > end_date:
+            warnings.warn(
+                f"Your start date of {start_date} is after your end date of "
+                f"{end_date}. Is this intended?"
+            )
+
+    return df.loc[_date_filter_conditions(_filter_list), :]
+
+
 @pf.register_dataframe_method
 def remove_columns(df: pd.DataFrame, columns: List):
     """
@@ -1615,6 +1844,7 @@ def collapse_levels(df: pd.DataFrame, sep: str = "_"):
         sep.join([str(el) for el in tup if str(el) != ""])
         for tup in df.columns.values
     ]
+
     return df
 
 


Test patch:
diff --git a/janitor/testing_utils/date_data.py b/janitor/testing_utils/date_data.py
new file mode 100644
--- /dev/null
+++ b/janitor/testing_utils/date_data.py
@@ -0,0 +1,1002 @@
+date_list = [
+    [int("01") * int("28"), "01/28/19"],
+    [int("01") * int("29"), "01/29/19"],
+    [int("01") * int("30"), "01/30/19"],
+    [int("01") * int("31"), "01/31/19"],
+    [int("02") * int("01"), "02/01/19"],
+    [int("02") * int("02"), "02/02/19"],
+    [int("02") * int("03"), "02/03/19"],
+    [int("02") * int("04"), "02/04/19"],
+    [int("02") * int("05"), "02/05/19"],
+    [int("02") * int("06"), "02/06/19"],
+    [int("02") * int("07"), "02/07/19"],
+    [int("02") * int("08"), "02/08/19"],
+    [int("02") * int("09"), "02/09/19"],
+    [int("02") * int("10"), "02/10/19"],
+    [int("02") * int("11"), "02/11/19"],
+    [int("02") * int("12"), "02/12/19"],
+    [int("02") * int("13"), "02/13/19"],
+    [int("02") * int("14"), "02/14/19"],
+    [int("02") * int("15"), "02/15/19"],
+    [int("02") * int("16"), "02/16/19"],
+    [int("02") * int("17"), "02/17/19"],
+    [int("02") * int("18"), "02/18/19"],
+    [int("02") * int("19"), "02/19/19"],
+    [int("02") * int("20"), "02/20/19"],
+    [int("02") * int("21"), "02/21/19"],
+    [int("02") * int("22"), "02/22/19"],
+    [int("02") * int("23"), "02/23/19"],
+    [int("02") * int("24"), "02/24/19"],
+    [int("02") * int("25"), "02/25/19"],
+    [int("02") * int("26"), "02/26/19"],
+    [int("02") * int("27"), "02/27/19"],
+    [int("02") * int("28"), "02/28/19"],
+    [int("03") * int("01"), "03/01/19"],
+    [int("03") * int("02"), "03/02/19"],
+    [int("03") * int("03"), "03/03/19"],
+    [int("03") * int("04"), "03/04/19"],
+    [int("03") * int("05"), "03/05/19"],
+    [int("03") * int("06"), "03/06/19"],
+    [int("03") * int("07"), "03/07/19"],
+    [int("03") * int("08"), "03/08/19"],
+    [int("03") * int("09"), "03/09/19"],
+    [int("03") * int("10"), "03/10/19"],
+    [int("03") * int("11"), "03/11/19"],
+    [int("03") * int("12"), "03/12/19"],
+    [int("03") * int("13"), "03/13/19"],
+    [int("03") * int("14"), "03/14/19"],
+    [int("03") * int("15"), "03/15/19"],
+    [int("03") * int("16"), "03/16/19"],
+    [int("03") * int("17"), "03/17/19"],
+    [int("03") * int("18"), "03/18/19"],
+    [int("03") * int("19"), "03/19/19"],
+    [int("03") * int("20"), "03/20/19"],
+    [int("03") * int("21"), "03/21/19"],
+    [int("03") * int("22"), "03/22/19"],
+    [int("03") * int("23"), "03/23/19"],
+    [int("03") * int("24"), "03/24/19"],
+    [int("03") * int("25"), "03/25/19"],
+    [int("03") * int("26"), "03/26/19"],
+    [int("03") * int("27"), "03/27/19"],
+    [int("03") * int("28"), "03/28/19"],
+    [int("03") * int("29"), "03/29/19"],
+    [int("03") * int("30"), "03/30/19"],
+    [int("03") * int("31"), "03/31/19"],
+    [int("04") * int("01"), "04/01/19"],
+    [int("04") * int("02"), "04/02/19"],
+    [int("04") * int("03"), "04/03/19"],
+    [int("04") * int("04"), "04/04/19"],
+    [int("04") * int("05"), "04/05/19"],
+    [int("04") * int("06"), "04/06/19"],
+    [int("04") * int("07"), "04/07/19"],
+    [int("04") * int("08"), "04/08/19"],
+    [int("04") * int("09"), "04/09/19"],
+    [int("04") * int("10"), "04/10/19"],
+    [int("04") * int("11"), "04/11/19"],
+    [int("04") * int("12"), "04/12/19"],
+    [int("04") * int("13"), "04/13/19"],
+    [int("04") * int("14"), "04/14/19"],
+    [int("04") * int("15"), "04/15/19"],
+    [int("04") * int("16"), "04/16/19"],
+    [int("04") * int("17"), "04/17/19"],
+    [int("04") * int("18"), "04/18/19"],
+    [int("04") * int("19"), "04/19/19"],
+    [int("04") * int("20"), "04/20/19"],
+    [int("04") * int("21"), "04/21/19"],
+    [int("04") * int("22"), "04/22/19"],
+    [int("04") * int("23"), "04/23/19"],
+    [int("04") * int("24"), "04/24/19"],
+    [int("04") * int("25"), "04/25/19"],
+    [int("04") * int("26"), "04/26/19"],
+    [int("04") * int("27"), "04/27/19"],
+    [int("04") * int("28"), "04/28/19"],
+    [int("04") * int("29"), "04/29/19"],
+    [int("04") * int("30"), "04/30/19"],
+    [int("05") * int("01"), "05/01/19"],
+    [int("05") * int("02"), "05/02/19"],
+    [int("05") * int("03"), "05/03/19"],
+    [int("05") * int("04"), "05/04/19"],
+    [int("05") * int("05"), "05/05/19"],
+    [int("05") * int("06"), "05/06/19"],
+    [int("05") * int("07"), "05/07/19"],
+    [int("05") * int("08"), "05/08/19"],
+    [int("05") * int("09"), "05/09/19"],
+    [int("05") * int("10"), "05/10/19"],
+    [int("05") * int("11"), "05/11/19"],
+    [int("05") * int("12"), "05/12/19"],
+    [int("05") * int("13"), "05/13/19"],
+    [int("05") * int("14"), "05/14/19"],
+    [int("05") * int("15"), "05/15/19"],
+    [int("05") * int("16"), "05/16/19"],
+    [int("05") * int("17"), "05/17/19"],
+    [int("05") * int("18"), "05/18/19"],
+    [int("05") * int("19"), "05/19/19"],
+    [int("05") * int("20"), "05/20/19"],
+    [int("05") * int("21"), "05/21/19"],
+    [int("05") * int("22"), "05/22/19"],
+    [int("05") * int("23"), "05/23/19"],
+    [int("05") * int("24"), "05/24/19"],
+    [int("05") * int("25"), "05/25/19"],
+    [int("05") * int("26"), "05/26/19"],
+    [int("05") * int("27"), "05/27/19"],
+    [int("05") * int("28"), "05/28/19"],
+    [int("05") * int("29"), "05/29/19"],
+    [int("05") * int("30"), "05/30/19"],
+    [int("05") * int("31"), "05/31/19"],
+    [int("06") * int("01"), "06/01/19"],
+    [int("06") * int("02"), "06/02/19"],
+    [int("06") * int("03"), "06/03/19"],
+    [int("06") * int("04"), "06/04/19"],
+    [int("06") * int("05"), "06/05/19"],
+    [int("06") * int("06"), "06/06/19"],
+    [int("06") * int("07"), "06/07/19"],
+    [int("06") * int("08"), "06/08/19"],
+    [int("06") * int("09"), "06/09/19"],
+    [int("06") * int("10"), "06/10/19"],
+    [int("06") * int("11"), "06/11/19"],
+    [int("06") * int("12"), "06/12/19"],
+    [int("06") * int("13"), "06/13/19"],
+    [int("06") * int("14"), "06/14/19"],
+    [int("06") * int("15"), "06/15/19"],
+    [int("06") * int("16"), "06/16/19"],
+    [int("06") * int("17"), "06/17/19"],
+    [int("06") * int("18"), "06/18/19"],
+    [int("06") * int("19"), "06/19/19"],
+    [int("06") * int("20"), "06/20/19"],
+    [int("06") * int("21"), "06/21/19"],
+    [int("06") * int("22"), "06/22/19"],
+    [int("06") * int("23"), "06/23/19"],
+    [int("06") * int("24"), "06/24/19"],
+    [int("06") * int("25"), "06/25/19"],
+    [int("06") * int("26"), "06/26/19"],
+    [int("06") * int("27"), "06/27/19"],
+    [int("06") * int("28"), "06/28/19"],
+    [int("06") * int("29"), "06/29/19"],
+    [int("06") * int("30"), "06/30/19"],
+    [int("07") * int("01"), "07/01/19"],
+    [int("07") * int("02"), "07/02/19"],
+    [int("07") * int("03"), "07/03/19"],
+    [int("07") * int("04"), "07/04/19"],
+    [int("07") * int("05"), "07/05/19"],
+    [int("07") * int("06"), "07/06/19"],
+    [int("07") * int("07"), "07/07/19"],
+    [int("07") * int("08"), "07/08/19"],
+    [int("07") * int("09"), "07/09/19"],
+    [int("07") * int("10"), "07/10/19"],
+    [int("07") * int("11"), "07/11/19"],
+    [int("07") * int("12"), "07/12/19"],
+    [int("07") * int("13"), "07/13/19"],
+    [int("07") * int("14"), "07/14/19"],
+    [int("07") * int("15"), "07/15/19"],
+    [int("07") * int("16"), "07/16/19"],
+    [int("07") * int("17"), "07/17/19"],
+    [int("07") * int("18"), "07/18/19"],
+    [int("07") * int("19"), "07/19/19"],
+    [int("07") * int("20"), "07/20/19"],
+    [int("07") * int("21"), "07/21/19"],
+    [int("07") * int("22"), "07/22/19"],
+    [int("07") * int("23"), "07/23/19"],
+    [int("07") * int("24"), "07/24/19"],
+    [int("07") * int("25"), "07/25/19"],
+    [int("07") * int("26"), "07/26/19"],
+    [int("07") * int("27"), "07/27/19"],
+    [int("07") * int("28"), "07/28/19"],
+    [int("07") * int("29"), "07/29/19"],
+    [int("07") * int("30"), "07/30/19"],
+    [int("07") * int("31"), "07/31/19"],
+    [int("08") * int("01"), "08/01/19"],
+    [int("08") * int("02"), "08/02/19"],
+    [int("08") * int("03"), "08/03/19"],
+    [int("08") * int("04"), "08/04/19"],
+    [int("08") * int("05"), "08/05/19"],
+    [int("08") * int("06"), "08/06/19"],
+    [int("08") * int("07"), "08/07/19"],
+    [int("08") * int("08"), "08/08/19"],
+    [int("08") * int("09"), "08/09/19"],
+    [int("08") * int("10"), "08/10/19"],
+    [int("08") * int("11"), "08/11/19"],
+    [int("08") * int("12"), "08/12/19"],
+    [int("08") * int("13"), "08/13/19"],
+    [int("08") * int("14"), "08/14/19"],
+    [int("08") * int("15"), "08/15/19"],
+    [int("08") * int("16"), "08/16/19"],
+    [int("08") * int("17"), "08/17/19"],
+    [int("08") * int("18"), "08/18/19"],
+    [int("08") * int("19"), "08/19/19"],
+    [int("08") * int("20"), "08/20/19"],
+    [int("08") * int("21"), "08/21/19"],
+    [int("08") * int("22"), "08/22/19"],
+    [int("08") * int("23"), "08/23/19"],
+    [int("08") * int("24"), "08/24/19"],
+    [int("08") * int("25"), "08/25/19"],
+    [int("08") * int("26"), "08/26/19"],
+    [int("08") * int("27"), "08/27/19"],
+    [int("08") * int("28"), "08/28/19"],
+    [int("08") * int("29"), "08/29/19"],
+    [int("08") * int("30"), "08/30/19"],
+    [int("08") * int("31"), "08/31/19"],
+    [int("09") * int("01"), "09/01/19"],
+    [int("09") * int("02"), "09/02/19"],
+    [int("09") * int("03"), "09/03/19"],
+    [int("09") * int("04"), "09/04/19"],
+    [int("09") * int("05"), "09/05/19"],
+    [int("09") * int("06"), "09/06/19"],
+    [int("09") * int("07"), "09/07/19"],
+    [int("09") * int("08"), "09/08/19"],
+    [int("09") * int("09"), "09/09/19"],
+    [int("09") * int("10"), "09/10/19"],
+    [int("09") * int("11"), "09/11/19"],
+    [int("09") * int("12"), "09/12/19"],
+    [int("09") * int("13"), "09/13/19"],
+    [int("09") * int("14"), "09/14/19"],
+    [int("09") * int("15"), "09/15/19"],
+    [int("09") * int("16"), "09/16/19"],
+    [int("09") * int("17"), "09/17/19"],
+    [int("09") * int("18"), "09/18/19"],
+    [int("09") * int("19"), "09/19/19"],
+    [int("09") * int("20"), "09/20/19"],
+    [int("09") * int("21"), "09/21/19"],
+    [int("09") * int("22"), "09/22/19"],
+    [int("09") * int("23"), "09/23/19"],
+    [int("09") * int("24"), "09/24/19"],
+    [int("09") * int("25"), "09/25/19"],
+    [int("09") * int("26"), "09/26/19"],
+    [int("09") * int("27"), "09/27/19"],
+    [int("09") * int("28"), "09/28/19"],
+    [int("09") * int("29"), "09/29/19"],
+    [int("09") * int("30"), "09/30/19"],
+    [int("10") * int("01"), "10/01/19"],
+    [int("10") * int("02"), "10/02/19"],
+    [int("10") * int("03"), "10/03/19"],
+    [int("10") * int("04"), "10/04/19"],
+    [int("10") * int("05"), "10/05/19"],
+    [int("10") * int("06"), "10/06/19"],
+    [int("10") * int("07"), "10/07/19"],
+    [int("10") * int("08"), "10/08/19"],
+    [int("10") * int("09"), "10/09/19"],
+    [int("10") * int("10"), "10/10/19"],
+    [int("10") * int("11"), "10/11/19"],
+    [int("10") * int("12"), "10/12/19"],
+    [int("10") * int("13"), "10/13/19"],
+    [int("10") * int("14"), "10/14/19"],
+    [int("10") * int("15"), "10/15/19"],
+    [int("10") * int("16"), "10/16/19"],
+    [int("10") * int("17"), "10/17/19"],
+    [int("10") * int("18"), "10/18/19"],
+    [int("10") * int("19"), "10/19/19"],
+    [int("10") * int("20"), "10/20/19"],
+    [int("10") * int("21"), "10/21/19"],
+    [int("10") * int("22"), "10/22/19"],
+    [int("10") * int("23"), "10/23/19"],
+    [int("10") * int("24"), "10/24/19"],
+    [int("10") * int("25"), "10/25/19"],
+    [int("10") * int("26"), "10/26/19"],
+    [int("10") * int("27"), "10/27/19"],
+    [int("10") * int("28"), "10/28/19"],
+    [int("10") * int("29"), "10/29/19"],
+    [int("10") * int("30"), "10/30/19"],
+    [int("10") * int("31"), "10/31/19"],
+    [int("11") * int("01"), "11/01/19"],
+    [int("11") * int("02"), "11/02/19"],
+    [int("11") * int("03"), "11/03/19"],
+    [int("11") * int("04"), "11/04/19"],
+    [int("11") * int("05"), "11/05/19"],
+    [int("11") * int("06"), "11/06/19"],
+    [int("11") * int("07"), "11/07/19"],
+    [int("11") * int("08"), "11/08/19"],
+    [int("11") * int("09"), "11/09/19"],
+    [int("11") * int("10"), "11/10/19"],
+    [int("11") * int("11"), "11/11/19"],
+    [int("11") * int("12"), "11/12/19"],
+    [int("11") * int("13"), "11/13/19"],
+    [int("11") * int("14"), "11/14/19"],
+    [int("11") * int("15"), "11/15/19"],
+    [int("11") * int("16"), "11/16/19"],
+    [int("11") * int("17"), "11/17/19"],
+    [int("11") * int("18"), "11/18/19"],
+    [int("11") * int("19"), "11/19/19"],
+    [int("11") * int("20"), "11/20/19"],
+    [int("11") * int("21"), "11/21/19"],
+    [int("11") * int("22"), "11/22/19"],
+    [int("11") * int("23"), "11/23/19"],
+    [int("11") * int("24"), "11/24/19"],
+    [int("11") * int("25"), "11/25/19"],
+    [int("11") * int("26"), "11/26/19"],
+    [int("11") * int("27"), "11/27/19"],
+    [int("11") * int("28"), "11/28/19"],
+    [int("11") * int("29"), "11/29/19"],
+    [int("11") * int("30"), "11/30/19"],
+    [int("12") * int("01"), "12/01/19"],
+    [int("12") * int("02"), "12/02/19"],
+    [int("12") * int("03"), "12/03/19"],
+    [int("12") * int("04"), "12/04/19"],
+    [int("12") * int("05"), "12/05/19"],
+    [int("12") * int("06"), "12/06/19"],
+    [int("12") * int("07"), "12/07/19"],
+    [int("12") * int("08"), "12/08/19"],
+    [int("12") * int("09"), "12/09/19"],
+    [int("12") * int("10"), "12/10/19"],
+    [int("12") * int("11"), "12/11/19"],
+    [int("12") * int("12"), "12/12/19"],
+    [int("12") * int("13"), "12/13/19"],
+    [int("12") * int("14"), "12/14/19"],
+    [int("12") * int("15"), "12/15/19"],
+    [int("12") * int("16"), "12/16/19"],
+    [int("12") * int("17"), "12/17/19"],
+    [int("12") * int("18"), "12/18/19"],
+    [int("12") * int("19"), "12/19/19"],
+    [int("12") * int("20"), "12/20/19"],
+    [int("12") * int("21"), "12/21/19"],
+    [int("12") * int("22"), "12/22/19"],
+    [int("12") * int("23"), "12/23/19"],
+    [int("12") * int("24"), "12/24/19"],
+    [int("12") * int("25"), "12/25/19"],
+    [int("12") * int("26"), "12/26/19"],
+    [int("12") * int("27"), "12/27/19"],
+    [int("12") * int("28"), "12/28/19"],
+    [int("12") * int("29"), "12/29/19"],
+    [int("12") * int("30"), "12/30/19"],
+    [int("12") * int("31"), "12/31/19"],
+    [int("01") * int("01"), "01/01/20"],
+    [int("01") * int("02"), "01/02/20"],
+    [int("01") * int("03"), "01/03/20"],
+    [int("01") * int("04"), "01/04/20"],
+    [int("01") * int("05"), "01/05/20"],
+    [int("01") * int("06"), "01/06/20"],
+    [int("01") * int("07"), "01/07/20"],
+    [int("01") * int("08"), "01/08/20"],
+    [int("01") * int("09"), "01/09/20"],
+    [int("01") * int("10"), "01/10/20"],
+    [int("01") * int("11"), "01/11/20"],
+    [int("01") * int("12"), "01/12/20"],
+    [int("01") * int("13"), "01/13/20"],
+    [int("01") * int("14"), "01/14/20"],
+    [int("01") * int("15"), "01/15/20"],
+    [int("01") * int("16"), "01/16/20"],
+    [int("01") * int("17"), "01/17/20"],
+    [int("01") * int("18"), "01/18/20"],
+    [int("01") * int("19"), "01/19/20"],
+    [int("01") * int("20"), "01/20/20"],
+    [int("01") * int("21"), "01/21/20"],
+    [int("01") * int("22"), "01/22/20"],
+    [int("01") * int("23"), "01/23/20"],
+    [int("01") * int("24"), "01/24/20"],
+    [int("01") * int("25"), "01/25/20"],
+    [int("01") * int("26"), "01/26/20"],
+    [int("01") * int("27"), "01/27/20"],
+    [int("01") * int("28"), "01/28/20"],
+    [int("01") * int("29"), "01/29/20"],
+    [int("01") * int("30"), "01/30/20"],
+    [int("01") * int("31"), "01/31/20"],
+    [int("02") * int("01"), "02/01/20"],
+    [int("02") * int("02"), "02/02/20"],
+    [int("02") * int("03"), "02/03/20"],
+    [int("02") * int("04"), "02/04/20"],
+    [int("02") * int("05"), "02/05/20"],
+    [int("02") * int("06"), "02/06/20"],
+    [int("02") * int("07"), "02/07/20"],
+    [int("02") * int("08"), "02/08/20"],
+    [int("02") * int("09"), "02/09/20"],
+    [int("02") * int("10"), "02/10/20"],
+    [int("02") * int("11"), "02/11/20"],
+    [int("02") * int("12"), "02/12/20"],
+    [int("02") * int("13"), "02/13/20"],
+    [int("02") * int("14"), "02/14/20"],
+    [int("02") * int("15"), "02/15/20"],
+    [int("02") * int("16"), "02/16/20"],
+    [int("02") * int("17"), "02/17/20"],
+    [int("02") * int("18"), "02/18/20"],
+    [int("02") * int("19"), "02/19/20"],
+    [int("02") * int("20"), "02/20/20"],
+    [int("02") * int("21"), "02/21/20"],
+    [int("02") * int("22"), "02/22/20"],
+    [int("02") * int("23"), "02/23/20"],
+    [int("02") * int("24"), "02/24/20"],
+    [int("02") * int("25"), "02/25/20"],
+    [int("02") * int("26"), "02/26/20"],
+    [int("02") * int("27"), "02/27/20"],
+    [int("02") * int("28"), "02/28/20"],
+    [int("02") * int("29"), "02/29/20"],
+    [int("03") * int("01"), "03/01/20"],
+    [int("03") * int("02"), "03/02/20"],
+    [int("03") * int("03"), "03/03/20"],
+    [int("03") * int("04"), "03/04/20"],
+    [int("03") * int("05"), "03/05/20"],
+    [int("03") * int("06"), "03/06/20"],
+    [int("03") * int("07"), "03/07/20"],
+    [int("03") * int("08"), "03/08/20"],
+    [int("03") * int("09"), "03/09/20"],
+    [int("03") * int("10"), "03/10/20"],
+    [int("03") * int("11"), "03/11/20"],
+    [int("03") * int("12"), "03/12/20"],
+    [int("03") * int("13"), "03/13/20"],
+    [int("03") * int("14"), "03/14/20"],
+    [int("03") * int("15"), "03/15/20"],
+    [int("03") * int("16"), "03/16/20"],
+    [int("03") * int("17"), "03/17/20"],
+    [int("03") * int("18"), "03/18/20"],
+    [int("03") * int("19"), "03/19/20"],
+    [int("03") * int("20"), "03/20/20"],
+    [int("03") * int("21"), "03/21/20"],
+    [int("03") * int("22"), "03/22/20"],
+    [int("03") * int("23"), "03/23/20"],
+    [int("03") * int("24"), "03/24/20"],
+    [int("03") * int("25"), "03/25/20"],
+    [int("03") * int("26"), "03/26/20"],
+    [int("03") * int("27"), "03/27/20"],
+    [int("03") * int("28"), "03/28/20"],
+    [int("03") * int("29"), "03/29/20"],
+    [int("03") * int("30"), "03/30/20"],
+    [int("03") * int("31"), "03/31/20"],
+    [int("04") * int("01"), "04/01/20"],
+    [int("04") * int("02"), "04/02/20"],
+    [int("04") * int("03"), "04/03/20"],
+    [int("04") * int("04"), "04/04/20"],
+    [int("04") * int("05"), "04/05/20"],
+    [int("04") * int("06"), "04/06/20"],
+    [int("04") * int("07"), "04/07/20"],
+    [int("04") * int("08"), "04/08/20"],
+    [int("04") * int("09"), "04/09/20"],
+    [int("04") * int("10"), "04/10/20"],
+    [int("04") * int("11"), "04/11/20"],
+    [int("04") * int("12"), "04/12/20"],
+    [int("04") * int("13"), "04/13/20"],
+    [int("04") * int("14"), "04/14/20"],
+    [int("04") * int("15"), "04/15/20"],
+    [int("04") * int("16"), "04/16/20"],
+    [int("04") * int("17"), "04/17/20"],
+    [int("04") * int("18"), "04/18/20"],
+    [int("04") * int("19"), "04/19/20"],
+    [int("04") * int("20"), "04/20/20"],
+    [int("04") * int("21"), "04/21/20"],
+    [int("04") * int("22"), "04/22/20"],
+    [int("04") * int("23"), "04/23/20"],
+    [int("04") * int("24"), "04/24/20"],
+    [int("04") * int("25"), "04/25/20"],
+    [int("04") * int("26"), "04/26/20"],
+    [int("04") * int("27"), "04/27/20"],
+    [int("04") * int("28"), "04/28/20"],
+    [int("04") * int("29"), "04/29/20"],
+    [int("04") * int("30"), "04/30/20"],
+    [int("05") * int("01"), "05/01/20"],
+    [int("05") * int("02"), "05/02/20"],
+    [int("05") * int("03"), "05/03/20"],
+    [int("05") * int("04"), "05/04/20"],
+    [int("05") * int("05"), "05/05/20"],
+    [int("05") * int("06"), "05/06/20"],
+    [int("05") * int("07"), "05/07/20"],
+    [int("05") * int("08"), "05/08/20"],
+    [int("05") * int("09"), "05/09/20"],
+    [int("05") * int("10"), "05/10/20"],
+    [int("05") * int("11"), "05/11/20"],
+    [int("05") * int("12"), "05/12/20"],
+    [int("05") * int("13"), "05/13/20"],
+    [int("05") * int("14"), "05/14/20"],
+    [int("05") * int("15"), "05/15/20"],
+    [int("05") * int("16"), "05/16/20"],
+    [int("05") * int("17"), "05/17/20"],
+    [int("05") * int("18"), "05/18/20"],
+    [int("05") * int("19"), "05/19/20"],
+    [int("05") * int("20"), "05/20/20"],
+    [int("05") * int("21"), "05/21/20"],
+    [int("05") * int("22"), "05/22/20"],
+    [int("05") * int("23"), "05/23/20"],
+    [int("05") * int("24"), "05/24/20"],
+    [int("05") * int("25"), "05/25/20"],
+    [int("05") * int("26"), "05/26/20"],
+    [int("05") * int("27"), "05/27/20"],
+    [int("05") * int("28"), "05/28/20"],
+    [int("05") * int("29"), "05/29/20"],
+    [int("05") * int("30"), "05/30/20"],
+    [int("05") * int("31"), "05/31/20"],
+    [int("06") * int("01"), "06/01/20"],
+    [int("06") * int("02"), "06/02/20"],
+    [int("06") * int("03"), "06/03/20"],
+    [int("06") * int("04"), "06/04/20"],
+    [int("06") * int("05"), "06/05/20"],
+    [int("06") * int("06"), "06/06/20"],
+    [int("06") * int("07"), "06/07/20"],
+    [int("06") * int("08"), "06/08/20"],
+    [int("06") * int("09"), "06/09/20"],
+    [int("06") * int("10"), "06/10/20"],
+    [int("06") * int("11"), "06/11/20"],
+    [int("06") * int("12"), "06/12/20"],
+    [int("06") * int("13"), "06/13/20"],
+    [int("06") * int("14"), "06/14/20"],
+    [int("06") * int("15"), "06/15/20"],
+    [int("06") * int("16"), "06/16/20"],
+    [int("06") * int("17"), "06/17/20"],
+    [int("06") * int("18"), "06/18/20"],
+    [int("06") * int("19"), "06/19/20"],
+    [int("06") * int("20"), "06/20/20"],
+    [int("06") * int("21"), "06/21/20"],
+    [int("06") * int("22"), "06/22/20"],
+    [int("06") * int("23"), "06/23/20"],
+    [int("06") * int("24"), "06/24/20"],
+    [int("06") * int("25"), "06/25/20"],
+    [int("06") * int("26"), "06/26/20"],
+    [int("06") * int("27"), "06/27/20"],
+    [int("06") * int("28"), "06/28/20"],
+    [int("06") * int("29"), "06/29/20"],
+    [int("06") * int("30"), "06/30/20"],
+    [int("07") * int("01"), "07/01/20"],
+    [int("07") * int("02"), "07/02/20"],
+    [int("07") * int("03"), "07/03/20"],
+    [int("07") * int("04"), "07/04/20"],
+    [int("07") * int("05"), "07/05/20"],
+    [int("07") * int("06"), "07/06/20"],
+    [int("07") * int("07"), "07/07/20"],
+    [int("07") * int("08"), "07/08/20"],
+    [int("07") * int("09"), "07/09/20"],
+    [int("07") * int("10"), "07/10/20"],
+    [int("07") * int("11"), "07/11/20"],
+    [int("07") * int("12"), "07/12/20"],
+    [int("07") * int("13"), "07/13/20"],
+    [int("07") * int("14"), "07/14/20"],
+    [int("07") * int("15"), "07/15/20"],
+    [int("07") * int("16"), "07/16/20"],
+    [int("07") * int("17"), "07/17/20"],
+    [int("07") * int("18"), "07/18/20"],
+    [int("07") * int("19"), "07/19/20"],
+    [int("07") * int("20"), "07/20/20"],
+    [int("07") * int("21"), "07/21/20"],
+    [int("07") * int("22"), "07/22/20"],
+    [int("07") * int("23"), "07/23/20"],
+    [int("07") * int("24"), "07/24/20"],
+    [int("07") * int("25"), "07/25/20"],
+    [int("07") * int("26"), "07/26/20"],
+    [int("07") * int("27"), "07/27/20"],
+    [int("07") * int("28"), "07/28/20"],
+    [int("07") * int("29"), "07/29/20"],
+    [int("07") * int("30"), "07/30/20"],
+    [int("07") * int("31"), "07/31/20"],
+    [int("08") * int("01"), "08/01/20"],
+    [int("08") * int("02"), "08/02/20"],
+    [int("08") * int("03"), "08/03/20"],
+    [int("08") * int("04"), "08/04/20"],
+    [int("08") * int("05"), "08/05/20"],
+    [int("08") * int("06"), "08/06/20"],
+    [int("08") * int("07"), "08/07/20"],
+    [int("08") * int("08"), "08/08/20"],
+    [int("08") * int("09"), "08/09/20"],
+    [int("08") * int("10"), "08/10/20"],
+    [int("08") * int("11"), "08/11/20"],
+    [int("08") * int("12"), "08/12/20"],
+    [int("08") * int("13"), "08/13/20"],
+    [int("08") * int("14"), "08/14/20"],
+    [int("08") * int("15"), "08/15/20"],
+    [int("08") * int("16"), "08/16/20"],
+    [int("08") * int("17"), "08/17/20"],
+    [int("08") * int("18"), "08/18/20"],
+    [int("08") * int("19"), "08/19/20"],
+    [int("08") * int("20"), "08/20/20"],
+    [int("08") * int("21"), "08/21/20"],
+    [int("08") * int("22"), "08/22/20"],
+    [int("08") * int("23"), "08/23/20"],
+    [int("08") * int("24"), "08/24/20"],
+    [int("08") * int("25"), "08/25/20"],
+    [int("08") * int("26"), "08/26/20"],
+    [int("08") * int("27"), "08/27/20"],
+    [int("08") * int("28"), "08/28/20"],
+    [int("08") * int("29"), "08/29/20"],
+    [int("08") * int("30"), "08/30/20"],
+    [int("08") * int("31"), "08/31/20"],
+    [int("09") * int("01"), "09/01/20"],
+    [int("09") * int("02"), "09/02/20"],
+    [int("09") * int("03"), "09/03/20"],
+    [int("09") * int("04"), "09/04/20"],
+    [int("09") * int("05"), "09/05/20"],
+    [int("09") * int("06"), "09/06/20"],
+    [int("09") * int("07"), "09/07/20"],
+    [int("09") * int("08"), "09/08/20"],
+    [int("09") * int("09"), "09/09/20"],
+    [int("09") * int("10"), "09/10/20"],
+    [int("09") * int("11"), "09/11/20"],
+    [int("09") * int("12"), "09/12/20"],
+    [int("09") * int("13"), "09/13/20"],
+    [int("09") * int("14"), "09/14/20"],
+    [int("09") * int("15"), "09/15/20"],
+    [int("09") * int("16"), "09/16/20"],
+    [int("09") * int("17"), "09/17/20"],
+    [int("09") * int("18"), "09/18/20"],
+    [int("09") * int("19"), "09/19/20"],
+    [int("09") * int("20"), "09/20/20"],
+    [int("09") * int("21"), "09/21/20"],
+    [int("09") * int("22"), "09/22/20"],
+    [int("09") * int("23"), "09/23/20"],
+    [int("09") * int("24"), "09/24/20"],
+    [int("09") * int("25"), "09/25/20"],
+    [int("09") * int("26"), "09/26/20"],
+    [int("09") * int("27"), "09/27/20"],
+    [int("09") * int("28"), "09/28/20"],
+    [int("09") * int("29"), "09/29/20"],
+    [int("09") * int("30"), "09/30/20"],
+    [int("10") * int("01"), "10/01/20"],
+    [int("10") * int("02"), "10/02/20"],
+    [int("10") * int("03"), "10/03/20"],
+    [int("10") * int("04"), "10/04/20"],
+    [int("10") * int("05"), "10/05/20"],
+    [int("10") * int("06"), "10/06/20"],
+    [int("10") * int("07"), "10/07/20"],
+    [int("10") * int("08"), "10/08/20"],
+    [int("10") * int("09"), "10/09/20"],
+    [int("10") * int("10"), "10/10/20"],
+    [int("10") * int("11"), "10/11/20"],
+    [int("10") * int("12"), "10/12/20"],
+    [int("10") * int("13"), "10/13/20"],
+    [int("10") * int("14"), "10/14/20"],
+    [int("10") * int("15"), "10/15/20"],
+    [int("10") * int("16"), "10/16/20"],
+    [int("10") * int("17"), "10/17/20"],
+    [int("10") * int("18"), "10/18/20"],
+    [int("10") * int("19"), "10/19/20"],
+    [int("10") * int("20"), "10/20/20"],
+    [int("10") * int("21"), "10/21/20"],
+    [int("10") * int("22"), "10/22/20"],
+    [int("10") * int("23"), "10/23/20"],
+    [int("10") * int("24"), "10/24/20"],
+    [int("10") * int("25"), "10/25/20"],
+    [int("10") * int("26"), "10/26/20"],
+    [int("10") * int("27"), "10/27/20"],
+    [int("10") * int("28"), "10/28/20"],
+    [int("10") * int("29"), "10/29/20"],
+    [int("10") * int("30"), "10/30/20"],
+    [int("10") * int("31"), "10/31/20"],
+    [int("11") * int("01"), "11/01/20"],
+    [int("11") * int("02"), "11/02/20"],
+    [int("11") * int("03"), "11/03/20"],
+    [int("11") * int("04"), "11/04/20"],
+    [int("11") * int("05"), "11/05/20"],
+    [int("11") * int("06"), "11/06/20"],
+    [int("11") * int("07"), "11/07/20"],
+    [int("11") * int("08"), "11/08/20"],
+    [int("11") * int("09"), "11/09/20"],
+    [int("11") * int("10"), "11/10/20"],
+    [int("11") * int("11"), "11/11/20"],
+    [int("11") * int("12"), "11/12/20"],
+    [int("11") * int("13"), "11/13/20"],
+    [int("11") * int("14"), "11/14/20"],
+    [int("11") * int("15"), "11/15/20"],
+    [int("11") * int("16"), "11/16/20"],
+    [int("11") * int("17"), "11/17/20"],
+    [int("11") * int("18"), "11/18/20"],
+    [int("11") * int("19"), "11/19/20"],
+    [int("11") * int("20"), "11/20/20"],
+    [int("11") * int("21"), "11/21/20"],
+    [int("11") * int("22"), "11/22/20"],
+    [int("11") * int("23"), "11/23/20"],
+    [int("11") * int("24"), "11/24/20"],
+    [int("11") * int("25"), "11/25/20"],
+    [int("11") * int("26"), "11/26/20"],
+    [int("11") * int("27"), "11/27/20"],
+    [int("11") * int("28"), "11/28/20"],
+    [int("11") * int("29"), "11/29/20"],
+    [int("11") * int("30"), "11/30/20"],
+    [int("12") * int("01"), "12/01/20"],
+    [int("12") * int("02"), "12/02/20"],
+    [int("12") * int("03"), "12/03/20"],
+    [int("12") * int("04"), "12/04/20"],
+    [int("12") * int("05"), "12/05/20"],
+    [int("12") * int("06"), "12/06/20"],
+    [int("12") * int("07"), "12/07/20"],
+    [int("12") * int("08"), "12/08/20"],
+    [int("12") * int("09"), "12/09/20"],
+    [int("12") * int("10"), "12/10/20"],
+    [int("12") * int("11"), "12/11/20"],
+    [int("12") * int("12"), "12/12/20"],
+    [int("12") * int("13"), "12/13/20"],
+    [int("12") * int("14"), "12/14/20"],
+    [int("12") * int("15"), "12/15/20"],
+    [int("12") * int("16"), "12/16/20"],
+    [int("12") * int("17"), "12/17/20"],
+    [int("12") * int("18"), "12/18/20"],
+    [int("12") * int("19"), "12/19/20"],
+    [int("12") * int("20"), "12/20/20"],
+    [int("12") * int("21"), "12/21/20"],
+    [int("12") * int("22"), "12/22/20"],
+    [int("12") * int("23"), "12/23/20"],
+    [int("12") * int("24"), "12/24/20"],
+    [int("12") * int("25"), "12/25/20"],
+    [int("12") * int("26"), "12/26/20"],
+    [int("12") * int("27"), "12/27/20"],
+    [int("12") * int("28"), "12/28/20"],
+    [int("12") * int("29"), "12/29/20"],
+    [int("12") * int("30"), "12/30/20"],
+    [int("12") * int("31"), "12/31/20"],
+    [int("01") * int("01"), "01/01/21"],
+    [int("01") * int("02"), "01/02/21"],
+    [int("01") * int("03"), "01/03/21"],
+    [int("01") * int("04"), "01/04/21"],
+    [int("01") * int("05"), "01/05/21"],
+    [int("01") * int("06"), "01/06/21"],
+    [int("01") * int("07"), "01/07/21"],
+    [int("01") * int("08"), "01/08/21"],
+    [int("01") * int("09"), "01/09/21"],
+    [int("01") * int("10"), "01/10/21"],
+    [int("01") * int("11"), "01/11/21"],
+    [int("01") * int("12"), "01/12/21"],
+    [int("01") * int("13"), "01/13/21"],
+    [int("01") * int("14"), "01/14/21"],
+    [int("01") * int("15"), "01/15/21"],
+    [int("01") * int("16"), "01/16/21"],
+    [int("01") * int("17"), "01/17/21"],
+    [int("01") * int("18"), "01/18/21"],
+    [int("01") * int("19"), "01/19/21"],
+    [int("01") * int("20"), "01/20/21"],
+    [int("01") * int("21"), "01/21/21"],
+    [int("01") * int("22"), "01/22/21"],
+    [int("01") * int("23"), "01/23/21"],
+    [int("01") * int("24"), "01/24/21"],
+    [int("01") * int("25"), "01/25/21"],
+    [int("01") * int("26"), "01/26/21"],
+    [int("01") * int("27"), "01/27/21"],
+    [int("01") * int("28"), "01/28/21"],
+    [int("01") * int("29"), "01/29/21"],
+    [int("01") * int("30"), "01/30/21"],
+    [int("01") * int("31"), "01/31/21"],
+    [int("02") * int("01"), "02/01/21"],
+    [int("02") * int("02"), "02/02/21"],
+    [int("02") * int("03"), "02/03/21"],
+    [int("02") * int("04"), "02/04/21"],
+    [int("02") * int("05"), "02/05/21"],
+    [int("02") * int("06"), "02/06/21"],
+    [int("02") * int("07"), "02/07/21"],
+    [int("02") * int("08"), "02/08/21"],
+    [int("02") * int("09"), "02/09/21"],
+    [int("02") * int("10"), "02/10/21"],
+    [int("02") * int("11"), "02/11/21"],
+    [int("02") * int("12"), "02/12/21"],
+    [int("02") * int("13"), "02/13/21"],
+    [int("02") * int("14"), "02/14/21"],
+    [int("02") * int("15"), "02/15/21"],
+    [int("02") * int("16"), "02/16/21"],
+    [int("02") * int("17"), "02/17/21"],
+    [int("02") * int("18"), "02/18/21"],
+    [int("02") * int("19"), "02/19/21"],
+    [int("02") * int("20"), "02/20/21"],
+    [int("02") * int("21"), "02/21/21"],
+    [int("02") * int("22"), "02/22/21"],
+    [int("02") * int("23"), "02/23/21"],
+    [int("02") * int("24"), "02/24/21"],
+    [int("02") * int("25"), "02/25/21"],
+    [int("02") * int("26"), "02/26/21"],
+    [int("02") * int("27"), "02/27/21"],
+    [int("02") * int("28"), "02/28/21"],
+    [int("03") * int("01"), "03/01/21"],
+    [int("03") * int("02"), "03/02/21"],
+    [int("03") * int("03"), "03/03/21"],
+    [int("03") * int("04"), "03/04/21"],
+    [int("03") * int("05"), "03/05/21"],
+    [int("03") * int("06"), "03/06/21"],
+    [int("03") * int("07"), "03/07/21"],
+    [int("03") * int("08"), "03/08/21"],
+    [int("03") * int("09"), "03/09/21"],
+    [int("03") * int("10"), "03/10/21"],
+    [int("03") * int("11"), "03/11/21"],
+    [int("03") * int("12"), "03/12/21"],
+    [int("03") * int("13"), "03/13/21"],
+    [int("03") * int("14"), "03/14/21"],
+    [int("03") * int("15"), "03/15/21"],
+    [int("03") * int("16"), "03/16/21"],
+    [int("03") * int("17"), "03/17/21"],
+    [int("03") * int("18"), "03/18/21"],
+    [int("03") * int("19"), "03/19/21"],
+    [int("03") * int("20"), "03/20/21"],
+    [int("03") * int("21"), "03/21/21"],
+    [int("03") * int("22"), "03/22/21"],
+    [int("03") * int("23"), "03/23/21"],
+    [int("03") * int("24"), "03/24/21"],
+    [int("03") * int("25"), "03/25/21"],
+    [int("03") * int("26"), "03/26/21"],
+    [int("03") * int("27"), "03/27/21"],
+    [int("03") * int("28"), "03/28/21"],
+    [int("03") * int("29"), "03/29/21"],
+    [int("03") * int("30"), "03/30/21"],
+    [int("03") * int("31"), "03/31/21"],
+    [int("04") * int("01"), "04/01/21"],
+    [int("04") * int("02"), "04/02/21"],
+    [int("04") * int("03"), "04/03/21"],
+    [int("04") * int("04"), "04/04/21"],
+    [int("04") * int("05"), "04/05/21"],
+    [int("04") * int("06"), "04/06/21"],
+    [int("04") * int("07"), "04/07/21"],
+    [int("04") * int("08"), "04/08/21"],
+    [int("04") * int("09"), "04/09/21"],
+    [int("04") * int("10"), "04/10/21"],
+    [int("04") * int("11"), "04/11/21"],
+    [int("04") * int("12"), "04/12/21"],
+    [int("04") * int("13"), "04/13/21"],
+    [int("04") * int("14"), "04/14/21"],
+    [int("04") * int("15"), "04/15/21"],
+    [int("04") * int("16"), "04/16/21"],
+    [int("04") * int("17"), "04/17/21"],
+    [int("04") * int("18"), "04/18/21"],
+    [int("04") * int("19"), "04/19/21"],
+    [int("04") * int("20"), "04/20/21"],
+    [int("04") * int("21"), "04/21/21"],
+    [int("04") * int("22"), "04/22/21"],
+    [int("04") * int("23"), "04/23/21"],
+    [int("04") * int("24"), "04/24/21"],
+    [int("04") * int("25"), "04/25/21"],
+    [int("04") * int("26"), "04/26/21"],
+    [int("04") * int("27"), "04/27/21"],
+    [int("04") * int("28"), "04/28/21"],
+    [int("04") * int("29"), "04/29/21"],
+    [int("04") * int("30"), "04/30/21"],
+    [int("05") * int("01"), "05/01/21"],
+    [int("05") * int("02"), "05/02/21"],
+    [int("05") * int("03"), "05/03/21"],
+    [int("05") * int("04"), "05/04/21"],
+    [int("05") * int("05"), "05/05/21"],
+    [int("05") * int("06"), "05/06/21"],
+    [int("05") * int("07"), "05/07/21"],
+    [int("05") * int("08"), "05/08/21"],
+    [int("05") * int("09"), "05/09/21"],
+    [int("05") * int("10"), "05/10/21"],
+    [int("05") * int("11"), "05/11/21"],
+    [int("05") * int("12"), "05/12/21"],
+    [int("05") * int("13"), "05/13/21"],
+    [int("05") * int("14"), "05/14/21"],
+    [int("05") * int("15"), "05/15/21"],
+    [int("05") * int("16"), "05/16/21"],
+    [int("05") * int("17"), "05/17/21"],
+    [int("05") * int("18"), "05/18/21"],
+    [int("05") * int("19"), "05/19/21"],
+    [int("05") * int("20"), "05/20/21"],
+    [int("05") * int("21"), "05/21/21"],
+    [int("05") * int("22"), "05/22/21"],
+    [int("05") * int("23"), "05/23/21"],
+    [int("05") * int("24"), "05/24/21"],
+    [int("05") * int("25"), "05/25/21"],
+    [int("05") * int("26"), "05/26/21"],
+    [int("05") * int("27"), "05/27/21"],
+    [int("05") * int("28"), "05/28/21"],
+    [int("05") * int("29"), "05/29/21"],
+    [int("05") * int("30"), "05/30/21"],
+    [int("05") * int("31"), "05/31/21"],
+    [int("06") * int("01"), "06/01/21"],
+    [int("06") * int("02"), "06/02/21"],
+    [int("06") * int("03"), "06/03/21"],
+    [int("06") * int("04"), "06/04/21"],
+    [int("06") * int("05"), "06/05/21"],
+    [int("06") * int("06"), "06/06/21"],
+    [int("06") * int("07"), "06/07/21"],
+    [int("06") * int("08"), "06/08/21"],
+    [int("06") * int("09"), "06/09/21"],
+    [int("06") * int("10"), "06/10/21"],
+    [int("06") * int("11"), "06/11/21"],
+    [int("06") * int("12"), "06/12/21"],
+    [int("06") * int("13"), "06/13/21"],
+    [int("06") * int("14"), "06/14/21"],
+    [int("06") * int("15"), "06/15/21"],
+    [int("06") * int("16"), "06/16/21"],
+    [int("06") * int("17"), "06/17/21"],
+    [int("06") * int("18"), "06/18/21"],
+    [int("06") * int("19"), "06/19/21"],
+    [int("06") * int("20"), "06/20/21"],
+    [int("06") * int("21"), "06/21/21"],
+    [int("06") * int("22"), "06/22/21"],
+    [int("06") * int("23"), "06/23/21"],
+    [int("06") * int("24"), "06/24/21"],
+    [int("06") * int("25"), "06/25/21"],
+    [int("06") * int("26"), "06/26/21"],
+    [int("06") * int("27"), "06/27/21"],
+    [int("06") * int("28"), "06/28/21"],
+    [int("06") * int("29"), "06/29/21"],
+    [int("06") * int("30"), "06/30/21"],
+    [int("07") * int("01"), "07/01/21"],
+    [int("07") * int("02"), "07/02/21"],
+    [int("07") * int("03"), "07/03/21"],
+    [int("07") * int("04"), "07/04/21"],
+    [int("07") * int("05"), "07/05/21"],
+    [int("07") * int("06"), "07/06/21"],
+    [int("07") * int("07"), "07/07/21"],
+    [int("07") * int("08"), "07/08/21"],
+    [int("07") * int("09"), "07/09/21"],
+    [int("07") * int("10"), "07/10/21"],
+    [int("07") * int("11"), "07/11/21"],
+    [int("07") * int("12"), "07/12/21"],
+    [int("07") * int("13"), "07/13/21"],
+    [int("07") * int("14"), "07/14/21"],
+    [int("07") * int("15"), "07/15/21"],
+    [int("07") * int("16"), "07/16/21"],
+    [int("07") * int("17"), "07/17/21"],
+    [int("07") * int("18"), "07/18/21"],
+    [int("07") * int("19"), "07/19/21"],
+    [int("07") * int("20"), "07/20/21"],
+    [int("07") * int("21"), "07/21/21"],
+    [int("07") * int("22"), "07/22/21"],
+    [int("07") * int("23"), "07/23/21"],
+    [int("07") * int("24"), "07/24/21"],
+    [int("07") * int("25"), "07/25/21"],
+    [int("07") * int("26"), "07/26/21"],
+    [int("07") * int("27"), "07/27/21"],
+    [int("07") * int("28"), "07/28/21"],
+    [int("07") * int("29"), "07/29/21"],
+    [int("07") * int("30"), "07/30/21"],
+    [int("07") * int("31"), "07/31/21"],
+    [int("08") * int("01"), "08/01/21"],
+    [int("08") * int("02"), "08/02/21"],
+    [int("08") * int("03"), "08/03/21"],
+    [int("08") * int("04"), "08/04/21"],
+    [int("08") * int("05"), "08/05/21"],
+    [int("08") * int("06"), "08/06/21"],
+    [int("08") * int("07"), "08/07/21"],
+    [int("08") * int("08"), "08/08/21"],
+    [int("08") * int("09"), "08/09/21"],
+    [int("08") * int("10"), "08/10/21"],
+    [int("08") * int("11"), "08/11/21"],
+    [int("08") * int("12"), "08/12/21"],
+    [int("08") * int("13"), "08/13/21"],
+    [int("08") * int("14"), "08/14/21"],
+    [int("08") * int("15"), "08/15/21"],
+    [int("08") * int("16"), "08/16/21"],
+    [int("08") * int("17"), "08/17/21"],
+    [int("08") * int("18"), "08/18/21"],
+    [int("08") * int("19"), "08/19/21"],
+    [int("08") * int("20"), "08/20/21"],
+    [int("08") * int("21"), "08/21/21"],
+    [int("08") * int("22"), "08/22/21"],
+    [int("08") * int("23"), "08/23/21"],
+    [int("08") * int("24"), "08/24/21"],
+    [int("08") * int("25"), "08/25/21"],
+    [int("08") * int("26"), "08/26/21"],
+    [int("08") * int("27"), "08/27/21"],
+    [int("08") * int("28"), "08/28/21"],
+    [int("08") * int("29"), "08/29/21"],
+    [int("08") * int("30"), "08/30/21"],
+    [int("08") * int("31"), "08/31/21"],
+    [int("09") * int("01"), "09/01/21"],
+    [int("09") * int("02"), "09/02/21"],
+    [int("09") * int("03"), "09/03/21"],
+    [int("09") * int("04"), "09/04/21"],
+    [int("09") * int("05"), "09/05/21"],
+    [int("09") * int("06"), "09/06/21"],
+    [int("09") * int("07"), "09/07/21"],
+    [int("09") * int("08"), "09/08/21"],
+    [int("09") * int("09"), "09/09/21"],
+    [int("09") * int("10"), "09/10/21"],
+    [int("09") * int("11"), "09/11/21"],
+    [int("09") * int("12"), "09/12/21"],
+    [int("09") * int("13"), "09/13/21"],
+    [int("09") * int("14"), "09/14/21"],
+    [int("09") * int("15"), "09/15/21"],
+    [int("09") * int("16"), "09/16/21"],
+    [int("09") * int("17"), "09/17/21"],
+    [int("09") * int("18"), "09/18/21"],
+    [int("09") * int("19"), "09/19/21"],
+    [int("09") * int("20"), "09/20/21"],
+    [int("09") * int("21"), "09/21/21"],
+    [int("09") * int("22"), "09/22/21"],
+    [int("09") * int("23"), "09/23/21"],
+    [int("09") * int("24"), "09/24/21"],
+    [int("09") * int("25"), "09/25/21"],
+    [int("09") * int("26"), "09/26/21"],
+    [int("09") * int("27"), "09/27/21"],
+    [int("09") * int("28"), "09/28/21"],
+    [int("09") * int("29"), "09/29/21"],
+    [int("09") * int("30"), "09/30/21"],
+    [int("10") * int("01"), "10/01/21"],
+    [int("10") * int("02"), "10/02/21"],
+    [int("10") * int("03"), "10/03/21"],
+    [int("10") * int("04"), "10/04/21"],
+    [int("10") * int("05"), "10/05/21"],
+    [int("10") * int("06"), "10/06/21"],
+    [int("10") * int("07"), "10/07/21"],
+    [int("10") * int("08"), "10/08/21"],
+    [int("10") * int("09"), "10/09/21"],
+    [int("10") * int("10"), "10/10/21"],
+    [int("10") * int("11"), "10/11/21"],
+    [int("10") * int("12"), "10/12/21"],
+    [int("10") * int("13"), "10/13/21"],
+    [int("10") * int("14"), "10/14/21"],
+    [int("10") * int("15"), "10/15/21"],
+    [int("10") * int("16"), "10/16/21"],
+    [int("10") * int("17"), "10/17/21"],
+    [int("10") * int("18"), "10/18/21"],
+    [int("10") * int("19"), "10/19/21"],
+    [int("10") * int("20"), "10/20/21"],
+    [int("10") * int("21"), "10/21/21"],
+    [int("10") * int("22"), "10/22/21"],
+    [int("10") * int("23"), "10/23/21"],
+]
diff --git a/janitor/testing_utils/fixtures.py b/janitor/testing_utils/fixtures.py
--- a/janitor/testing_utils/fixtures.py
+++ b/janitor/testing_utils/fixtures.py
@@ -1,6 +1,7 @@
 import numpy as np
 import pandas as pd
 import pytest
+from janitor.testing_utils import date_data
 
 
 @pytest.fixture
@@ -16,6 +17,12 @@ def dataframe():
     return df
 
 
+@pytest.fixture
+def date_dataframe():
+    df = pd.DataFrame(date_data.date_list, columns=["AMOUNT", "DATE"])
+    return df
+
+
 @pytest.fixture
 def null_df():
     np.random.seed([3, 1415])
diff --git a/tests/functions/test_filter_date.py b/tests/functions/test_filter_date.py
new file mode 100644
--- /dev/null
+++ b/tests/functions/test_filter_date.py
@@ -0,0 +1,87 @@
+import numpy as np
+import pandas as pd
+import pytest
+from janitor.testing_utils.fixtures import date_dataframe
+
+
+def test_filter_date_column_name(date_dataframe):
+    df = date_dataframe
+    # column wasn't a string
+    with pytest.raises(TypeError):
+        df.filter_date(column=42)
+
+
+def test_filter_date_year(date_dataframe):
+    df = date_dataframe.filter_date(column="DATE", years=[2020])
+
+    def _get_year(x):
+        return x.year
+
+    assert df.DATE.apply(_get_year).unique()[0] == 2020
+
+
+def test_filter_date_years(date_dataframe):
+    df = date_dataframe.filter_date(column="DATE", years=[2020, 2021])
+
+    def _get_year(x):
+        return x.year
+
+    test_result = df.DATE.apply(_get_year).unique()
+    expected_result = np.array([2020, 2021])
+
+    assert np.array_equal(test_result, expected_result)
+
+
+def test_filter_date_month(date_dataframe):
+    df = date_dataframe.filter_date(column="DATE", months=range(10, 12))
+
+    def _get_month(x):
+        return x.month
+
+    test_result = df.DATE.apply(_get_month).unique()
+    expected_result = np.array([10, 11])
+
+    assert np.array_equal(test_result, expected_result)
+
+
+def test_filter_date_start(date_dataframe):
+    start = "02/01/19"
+
+    df = date_dataframe.filter_date(column="DATE", start=start)
+
+    test_date = pd.to_datetime("01/31/19")
+    test_result = df[df.DATE <= test_date]
+
+    assert test_result.empty
+
+
+def test_filter_date_start_and_end(date_dataframe):
+    start = "02/01/19"
+    end = "02/02/19"
+
+    df = date_dataframe.filter_date(column="DATE", start=start, end=end)
+
+    assert df.shape[0] == 2
+
+
+def test_filter_different_date_format(date_dataframe):
+    end = "01@@@@29@@@@19"
+    format = "%m@@@@%d@@@@%y"
+    df = date_dataframe.filter_date(column="DATE", end=end, format=format)
+
+    assert df.shape[0] == 2
+
+
+def test_column_date_options(date_dataframe):
+    end = "01/29/19"
+    column_date_options = {"dayfirst": True}
+
+    # Parse the dates with the first value as the day. For our purposes this
+    # basically is taking the month and turning it into a "day". It's
+    # incorrect, but used here to see that the column_date_options parameter
+    # can be passed through to the filter_date function.
+
+    df = date_dataframe.filter_date(
+        column="DATE", end=end, column_date_options=column_date_options
+    )
+    assert df.shape[0] == 13
diff --git a/tests/test_df_registration.py b/tests/test_df_registration.py
--- a/tests/test_df_registration.py
+++ b/tests/test_df_registration.py
@@ -91,3 +91,7 @@ def test_remove_columns_registration(dataframe):
 
 def test_change_type_registration(dataframe):
     assert dataframe.__getattr__("change_type")
+
+
+def test_change_type_registration(dataframe):
+    assert dataframe.__getattr__("filter_date")