You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by jo...@apache.org on 2018/06/27 16:09:45 UTC
[incubator-superset] branch master updated: [get_df] Fix datetime
conversion (#5274)
This is an automated email from the ASF dual-hosted git repository.
johnbodley pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
The following commit(s) were added to refs/heads/master by this push:
new 117507c [get_df] Fix datetime conversion (#5274)
117507c is described below
commit 117507cf310be7d2a3937ab188024271fe49b6a7
Author: John Bodley <45...@users.noreply.github.com>
AuthorDate: Wed Jun 27 09:09:42 2018 -0700
[get_df] Fix datetime conversion (#5274)
---
superset/viz.py | 8 ++----
tests/viz_tests.py | 81 +++++++++++++++++++++++++-----------------------------
2 files changed, 40 insertions(+), 49 deletions(-)
diff --git a/superset/viz.py b/superset/viz.py
index 89b8065..a595e49 100644
--- a/superset/viz.py
+++ b/superset/viz.py
@@ -197,13 +197,11 @@ class BaseViz(object):
# be considered as the default ISO date format
# If the datetime format is unix, the parse will use the corresponding
# parsing logic.
- if df is None or df.empty:
- return pd.DataFrame()
- else:
+ if not df.empty:
if DTTM_ALIAS in df.columns:
if timestamp_format in ('epoch_s', 'epoch_ms'):
- df[DTTM_ALIAS] = pd.to_datetime(
- df[DTTM_ALIAS], utc=False, unit=timestamp_format[6:])
+ # Column has already been formatted as a timestamp.
+ df[DTTM_ALIAS] = df[DTTM_ALIAS].apply(pd.Timestamp)
else:
df[DTTM_ALIAS] = pd.to_datetime(
df[DTTM_ALIAS], utc=False, format=timestamp_format)
diff --git a/tests/viz_tests.py b/tests/viz_tests.py
index 30c37c8..1bc6e62 100644
--- a/tests/viz_tests.py
+++ b/tests/viz_tests.py
@@ -38,17 +38,13 @@ class BaseVizTestCase(unittest.TestCase):
def test_get_df_returns_empty_df(self):
datasource = Mock()
datasource.type = 'table'
- mock_dttm_col = Mock()
- mock_dttm_col.python_date_format = Mock()
- datasource.get_col = Mock(return_value=mock_dttm_col)
form_data = {'dummy': 123}
query_obj = {'granularity': 'day'}
results = Mock()
results.query = Mock()
results.status = Mock()
results.error_message = None
- results.df = Mock()
- results.df.empty = True
+ results.df = pd.DataFrame()
datasource.query = Mock(return_value=results)
test_viz = viz.BaseViz(datasource, form_data)
result = test_viz.get_df(query_obj)
@@ -56,55 +52,52 @@ class BaseVizTestCase(unittest.TestCase):
self.assertTrue(result.empty)
def test_get_df_handles_dttm_col(self):
- datasource = Mock()
- datasource.type = 'table'
- datasource.offset = 1
- mock_dttm_col = Mock()
- mock_dttm_col.python_date_format = 'epoch_ms'
- datasource.get_col = Mock(return_value=mock_dttm_col)
form_data = {'dummy': 123}
query_obj = {'granularity': 'day'}
results = Mock()
results.query = Mock()
results.status = Mock()
results.error_message = Mock()
- df = Mock()
- df.columns = [DTTM_ALIAS]
- f_datetime = datetime(1960, 1, 1, 5, 0)
- df.__getitem__ = Mock(return_value=pd.Series([f_datetime]))
- df.__setitem__ = Mock()
- df.replace = Mock()
- df.fillna = Mock()
- results.df = df
- results.df.empty = False
+ datasource = Mock()
+ datasource.type = 'table'
datasource.query = Mock(return_value=results)
+ mock_dttm_col = Mock()
+ datasource.get_col = Mock(return_value=mock_dttm_col)
test_viz = viz.BaseViz(datasource, form_data)
-
test_viz.df_metrics_to_num = Mock()
test_viz.get_fillna_for_columns = Mock(return_value=0)
- test_viz.get_df(query_obj)
- mock_call = df.__setitem__.mock_calls[0]
- self.assertEqual(mock_call[1][0], DTTM_ALIAS)
- self.assertFalse(mock_call[1][1].empty)
- self.assertEqual(mock_call[1][1][0], f_datetime)
- mock_call = df.__setitem__.mock_calls[1]
- self.assertEqual(mock_call[1][0], DTTM_ALIAS)
- self.assertEqual(mock_call[1][1][0].hour, 6)
- self.assertEqual(mock_call[1][1].dtype, 'datetime64[ns]')
- mock_dttm_col.python_date_format = 'utc'
- test_viz.get_df(query_obj)
- mock_call = df.__setitem__.mock_calls[2]
- self.assertEqual(mock_call[1][0], DTTM_ALIAS)
- self.assertFalse(mock_call[1][1].empty)
- self.assertEqual(mock_call[1][1][0].hour, 7)
- mock_call = df.__setitem__.mock_calls[3]
- self.assertEqual(mock_call[1][0], DTTM_ALIAS)
- self.assertEqual(mock_call[1][1][0].hour, 6)
- self.assertEqual(mock_call[1][1].dtype, 'datetime64[ns]')
- mock_call = df.__setitem__.mock_calls[4]
- self.assertEqual(mock_call[1][0], DTTM_ALIAS)
- self.assertEqual(mock_call[1][1][0].hour, 7)
- self.assertEqual(mock_call[1][1].dtype, 'datetime64[ns]')
+
+ results.df = pd.DataFrame(data={DTTM_ALIAS: ['1960-01-01 05:00:00']})
+ datasource.offset = 0
+ mock_dttm_col.python_date_format = 'epoch_ms'
+ result = test_viz.get_df(query_obj)
+ pd.testing.assert_series_equal(
+ result[DTTM_ALIAS],
+ pd.Series([datetime(1960, 1, 1, 5, 0)], name=DTTM_ALIAS),
+ )
+
+ mock_dttm_col.python_date_format = None
+ result = test_viz.get_df(query_obj)
+ pd.testing.assert_series_equal(
+ result[DTTM_ALIAS],
+ pd.Series([datetime(1960, 1, 1, 5, 0)], name=DTTM_ALIAS),
+ )
+
+ datasource.offset = 1
+ result = test_viz.get_df(query_obj)
+ pd.testing.assert_series_equal(
+ result[DTTM_ALIAS],
+ pd.Series([datetime(1960, 1, 1, 6, 0)], name=DTTM_ALIAS),
+ )
+
+ datasource.offset = 0
+ results.df = pd.DataFrame(data={DTTM_ALIAS: ['1960-01-01']})
+ mock_dttm_col.python_date_format = '%Y-%m-%d'
+ result = test_viz.get_df(query_obj)
+ pd.testing.assert_series_equal(
+ result[DTTM_ALIAS],
+ pd.Series([datetime(1960, 1, 1, 0, 0)], name=DTTM_ALIAS),
+ )
def test_cache_timeout(self):
datasource = Mock()