def test_filter_by_date_range(sample_data): """It should keep rows on a specific range""" df = pd.DataFrame(sample_data) df = filter_by_date(df, 'date', start='2018-01-28', stop='2018-02-02') expected = pd.DataFrame([ { 'date': '2018-01-28', 'value': 0 }, { 'date': '2018-01-28', 'value': 1 }, { 'date': '2018-01-29', 'value': 2 }, { 'date': '2018-01-30', 'value': 3 }, { 'date': '2018-01-31', 'value': 4 }, { 'date': '2018-02-01', 'value': 5 }, ]) assert_frame_equal_noindex(df, expected)
def test_filter_by_date_start_only_with_offset(sample_data): """It should filter rows after a specific date with offset""" df = pd.DataFrame(sample_data) df = filter_by_date(df, 'date', start='(2018-01-30) + 2days') expected = pd.DataFrame([ { 'date': '2018-02-01', 'value': 5 }, { 'date': '2018-02-02', 'value': 6 }, { 'date': YESTERDAY, 'value': 7 }, { 'date': TODAY, 'value': 8 }, { 'date': TOMORROW, 'value': 9 }, { 'date': BEFORE_YESTERDAY, 'value': 10 }, ]) assert_frame_equal_noindex(df, expected)
def test_date_format(): """It should take date_format into account""" df = pd.DataFrame([ { 'date': '01 2018', 'value': 1 }, { 'date': '03 2018', 'value': 2 }, { 'date': '03 2018', 'value': 3 }, ]) df = filter_by_date(df, date_col='date', date_format='%m %Y', start='(02 2018)+10d') expected = pd.DataFrame([{ 'date': '03 2018', 'value': 2 }, { 'date': '03 2018', 'value': 3 }]) assert_frame_equal_noindex(df, expected)
def test_filter_by_date_start_symbolic_tomorrow(sample_data): """It should understand 'TOMORROW' as a valid start date""" df = pd.DataFrame(sample_data) df = filter_by_date(df, 'date', atdate='TOMORROW') expected = pd.DataFrame([ { 'date': TOMORROW, 'value': 9 }, ]) assert_frame_equal_noindex(df, expected)
def test_filter_by_date_start_symbolic_yesterday(sample_data): """It should understand 'YESTERDAY' as a valid start date""" df = pd.DataFrame(sample_data) df = filter_by_date(df, 'date', atdate='YESTERDAY') expected = pd.DataFrame([ { 'date': YESTERDAY, 'value': 7 }, ]) assert_frame_equal_noindex(df, expected)
def test_filter_by_date_start_symbolic_today_and_offset(sample_data): """It should understand 'TODAY' with offset as a valid start date""" df = pd.DataFrame(sample_data) df = filter_by_date(df, 'date', start='(TODAY) + 1d') expected = pd.DataFrame([ { 'date': TOMORROW, 'value': 9 }, ]) assert_frame_equal_noindex(df, expected)
def test_filter_by_date_stop_only_with_offset(sample_data): """It should keep rows before a specific date with offset""" df = pd.DataFrame(sample_data) df = filter_by_date(df, 'date', stop='(2018-01-30) - 1d') expected = pd.DataFrame([{ 'date': '2018-01-28', 'value': 0 }, { 'date': '2018-01-28', 'value': 1 }]) assert_frame_equal_noindex(df, expected)
def test_filter_by_date_atdate(sample_data): """It should filter rows on a specific date""" df = pd.DataFrame(sample_data) df = filter_by_date(df, 'date', atdate='2018-01-28') expected = pd.DataFrame([{ 'date': '2018-01-28', 'value': 0 }, { 'date': '2018-01-28', 'value': 1 }]) assert_frame_equal_noindex(df, expected)
def test_filter_by_date_range_with_offsets(sample_data): """It should keep rows on a specific range with offsets""" df = pd.DataFrame(sample_data) df = filter_by_date(df, 'date', start='(2018-01-28)+1d', stop='(2018-02-02)-2d') expected = pd.DataFrame([{ 'date': '2018-01-29', 'value': 2 }, { 'date': '2018-01-30', 'value': 3 }]) assert_frame_equal_noindex(df, expected)
def test_filter_by_date_stop_only(sample_data): """It should keep rows before a specific date""" df = pd.DataFrame(sample_data) df = filter_by_date(df, 'date', stop='2018-01-30') expected = pd.DataFrame([ { 'date': '2018-01-28', 'value': 0 }, { 'date': '2018-01-28', 'value': 1 }, { 'date': '2018-01-29', 'value': 2 }, ]) assert_frame_equal_noindex(df, expected)
def test_filter_by_date_stop_only_with_week_offset(sample_data): """It should keep rows before a specific date with offset""" df = pd.DataFrame(sample_data) for weekalias in ('w', 'W', 'week', 'weeks', 'Week', 'Weeks'): df = filter_by_date(df, 'date', stop=f'(2018-01-16) + 2{weekalias}') expected = pd.DataFrame([ { 'date': '2018-01-28', 'value': 0 }, { 'date': '2018-01-28', 'value': 1 }, { 'date': '2018-01-29', 'value': 2 }, ]) assert_frame_equal_noindex(df, expected)
def test_filter_date_invalid_calls(sample_data): """It should forbid invalid start/stop/atdate combinations""" df = pd.DataFrame(sample_data) with pytest.raises(TypeError): # no filter specification filter_by_date(df, 'date') with pytest.raises(TypeError): # start, stop and atdate can't be all specified filter_by_date(df, 'date', start='2018-01-01', stop='2018-01-01', atdate='2018-01-01') with pytest.raises(TypeError): # start and atdate are mutually exclusive filter_by_date(df, 'date', start='2018-01-01', atdate='2018-01-01') with pytest.raises(TypeError): # stop and atdate are mutually exclusive filter_by_date(df, 'date', stop='2018-01-01', atdate='2018-01-01') with pytest.raises(ValueError): # bad date format filter_by_date(df, 'date', start='2018-01-01', date_format='%m %Y') with pytest.raises(ValueError): # bad date format filter_by_date(df, 'date', start='01 2018', date_format='%m %Y') with pytest.raises(ValueError): # bad offset syntax (missing parenthesis) filter_by_date(df, 'date', start='2018-01-01 + 1day', date_format='%m %Y')