Skip to content

Commit cdbcdcc

Browse files
authored
Merge pull request #1270 from mito-ds/datetime-filter-bug
Add better handling for datetime filters
2 parents ffb7726 + ed3c059 commit cdbcdcc

File tree

8 files changed

+33
-10
lines changed

8 files changed

+33
-10
lines changed

mitosheet/mitosheet/code_chunks/step_performers/filter_code_chunk.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77

88
from copy import copy
9+
from datetime import date
910
from typing import List, Optional, Tuple, Union
1011

1112
from mitosheet.code_chunks.code_chunk import CodeChunk
@@ -25,6 +26,7 @@
2526
get_column_header_as_transpiled_code, get_list_as_string_without_internal_quotes)
2627
from mitosheet.types import (ColumnHeader, ColumnID, ColumnIDWithFilterGroup,
2728
Filter, FilterGroup, OperatorType)
29+
import pandas as pd
2830

2931
# Dict used when a filter condition is only used by one filter
3032
FILTER_FORMAT_STRING_DICT = {
@@ -180,7 +182,7 @@
180182
OPERATOR_SIGNS = {"Or": "|", "And": "&"}
181183

182184
def get_single_filter_string(
183-
df_name: str, column_header: ColumnHeader, filter_: Filter
185+
df_name: str, column_header: ColumnHeader, column_dtype: str, filter_: Filter
184186
) -> str:
185187
"""
186188
Transpiles a specific filter to a fitler string, to be used
@@ -189,6 +191,14 @@ def get_single_filter_string(
189191
condition = filter_["condition"]
190192
value = filter_["value"]
191193

194+
# When users are mid-way through typing a date in the UI, it might not be valid yet.
195+
# To prevent throwing errors, we set it to the minimum date
196+
if is_datetime_dtype(column_dtype):
197+
try:
198+
pd.to_datetime(value)
199+
except:
200+
value = pd.Timestamp.min + pd.Timedelta(seconds=1)
201+
192202
transpiled_column_header = get_column_header_as_transpiled_code(column_header)
193203
value = get_column_header_as_transpiled_code(value)
194204

@@ -289,7 +299,7 @@ def create_filter_string_for_condition(
289299
elif len(filters_with_condition) == 1:
290300
# Use the single filter condition
291301
return get_single_filter_string(
292-
df_name, column_header, filters_with_condition[0]
302+
df_name, column_header, column_dtype, filters_with_condition[0]
293303
)
294304
elif len(filters_with_condition) > 1:
295305
# Use the multiple filter condition

mitosheet/mitosheet/code_chunks/step_performers/pivot_code_chunk.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,11 @@ def get_code(self) -> Tuple[List[str], List[str]]:
155155
for column_id, value in self.values_column_ids_map.items()
156156
}
157157
pivot_filters: List[ColumnHeaderWithFilter] = [
158-
{'column_header': self.prev_state.column_ids.get_column_header_by_id(self.sheet_index, pf['column_id']), 'filter': pf['filter']}
158+
{
159+
'column_header': self.prev_state.column_ids.get_column_header_by_id(self.sheet_index, pf['column_id']),
160+
'column_dtype': str(self.prev_state.dfs[self.sheet_index][pf['column_id']].dtype),
161+
'filter': pf['filter']
162+
}
159163
for pf in self.pivot_filters_ids
160164
]
161165

@@ -168,7 +172,7 @@ def get_code(self) -> Tuple[List[str], List[str]]:
168172
# First, filter down to the rows of the original dataframe that we need
169173
if len(pivot_filters) > 0:
170174
filter_strings = [
171-
get_single_filter_string(self.old_df_name, pf['column_header'], pf['filter'])
175+
get_single_filter_string(self.old_df_name, pf['column_header'], pf['column_dtype'], pf['filter'])
172176
for pf in pivot_filters
173177
]
174178
full_filter_string = combine_filter_strings('And', filter_strings)

mitosheet/mitosheet/tests/saved_analyses/test_save_utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import pytest
1515
from mitosheet.saved_analyses import SAVED_ANALYSIS_FOLDER, write_save_analysis_file
1616
from mitosheet.saved_analyses.save_utils import read_and_upgrade_analysis
17-
from mitosheet.step_performers.filter import FC_NUMBER_EXACTLY
17+
from mitosheet.types import FC_NUMBER_EXACTLY
1818
from mitosheet.tests.test_utils import (create_mito_wrapper_with_data,
1919
create_mito_wrapper)
2020

mitosheet/mitosheet/tests/step_performers/test_filter.py

+10
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,16 @@
322322
data={"A": pd.to_datetime(pd.Series(data=["12-2-2020", "12-3-2020"]))}
323323
),
324324
),
325+
# Test for when the year is not fully inputted yet so the date is invalid.
326+
# We don't throw an error for this so that the user can continue inputting the date.
327+
(
328+
pd.DataFrame(
329+
data={"A": pd.to_datetime(pd.Series(data=["12-2-2020", "12-3-2020"]))}
330+
),
331+
FC_DATETIME_LESS_THAN_OR_EQUAL,
332+
"12-2-0020",
333+
pd.DataFrame(data={"A": pd.to_datetime(pd.Series(data=[], dtype='float64'))}),
334+
),
325335
(
326336
pd.DataFrame(
327337
data={"A": pd.to_datetime(pd.Series(data=["12-2-2020", "12-3-2020"]))}

mitosheet/mitosheet/tests/step_performers/test_pivot.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from pandas.testing import assert_frame_equal
1616

1717
from mitosheet.saved_analyses import read_and_upgrade_analysis
18-
from mitosheet.step_performers.filter import (FC_BOOLEAN_IS_TRUE,
18+
from mitosheet.types import (FC_BOOLEAN_IS_TRUE,
1919
FC_DATETIME_EXACTLY,
2020
FC_NUMBER_EXACTLY,
2121
FC_NUMBER_GREATER,
@@ -34,7 +34,6 @@
3434
from mitosheet.tests.decorators import pandas_post_1_only, pandas_pre_1_only
3535
from mitosheet.tests.test_utils import (create_mito_wrapper,
3636
get_dataframe_generation_code)
37-
from mitosheet.types import ColumnHeaderWithPivotTransform
3837

3938

4039
def test_simple_pivot():

mitosheet/mitosheet/tests/step_performers/test_set_dataframe_format.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@
1111
import pandas as pd
1212
import pytest
1313
from mitosheet.state import NUMBER_FORMAT_PLAIN_TEXT, NUMBER_FORMAT_CURRENCY, get_default_dataframe_format
14-
from mitosheet.step_performers.filter import FC_NUMBER_GREATER
1514
from mitosheet.tests.test_utils import create_mito_wrapper
16-
from mitosheet.types import ConditionalFormat, DataframeFormat
15+
from mitosheet.types import ConditionalFormat, DataframeFormat, FC_NUMBER_GREATER
1716

1817

1918

mitosheet/mitosheet/tests/updates/test_undo.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"""
99
import pandas as pd
1010

11-
from mitosheet.step_performers.filter import FC_NUMBER_EXACTLY
11+
from mitosheet.types import FC_NUMBER_EXACTLY
1212
from mitosheet.tests.test_utils import create_mito_wrapper_with_data, create_mito_wrapper
1313

1414

mitosheet/mitosheet/types.py

+1
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ class ColumnIDWithFilterGroup(TypedDict):
204204

205205
class ColumnHeaderWithFilter(TypedDict):
206206
column_header: ColumnHeader
207+
column_dtype: str
207208
filter: Filter
208209

209210
class ColumnIDWithPivotTransform(TypedDict):

0 commit comments

Comments
 (0)