mirror of https://github.com/apache/superset.git
Workaround pandas bug in datetimes with time zones (#3910)
A bug in to_dict(orient="records") in pandas/core/frame.py prevents datetimes with time zones to be worked with. This works around the issue in superset by re-implementing the logic of pandas in the correct way. Until pandas fixes the issue this code should stay. https://github.com/pandas-dev/pandas/issues/18372 This closes #1929
This commit is contained in:
parent
3c72e1f8fb
commit
4ae77ba8af
|
@ -14,6 +14,7 @@ from datetime import date, datetime
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
from pandas.core.common import _maybe_box_datetimelike
|
||||||
from pandas.core.dtypes.dtypes import ExtensionDtype
|
from pandas.core.dtypes.dtypes import ExtensionDtype
|
||||||
from past.builtins import basestring
|
from past.builtins import basestring
|
||||||
|
|
||||||
|
@ -48,7 +49,10 @@ class SupersetDataFrame(object):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def data(self):
|
def data(self):
|
||||||
return self.__df.to_dict(orient='records')
|
# work around for https://github.com/pandas-dev/pandas/issues/18372
|
||||||
|
return [dict((k, _maybe_box_datetimelike(v))
|
||||||
|
for k, v in zip(self.__df.columns, np.atleast_1d(row)))
|
||||||
|
for row in self.__df.values]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def db_type(cls, dtype):
|
def db_type(cls, dtype):
|
||||||
|
|
|
@ -5,6 +5,7 @@ from __future__ import print_function
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import csv
|
import csv
|
||||||
|
import datetime
|
||||||
import doctest
|
import doctest
|
||||||
import io
|
import io
|
||||||
import json
|
import json
|
||||||
|
@ -13,9 +14,11 @@ import random
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from flask import escape
|
from flask import escape
|
||||||
|
import pandas as pd
|
||||||
|
import psycopg2
|
||||||
import sqlalchemy as sqla
|
import sqlalchemy as sqla
|
||||||
|
|
||||||
from superset import appbuilder, db, jinja_context, sm, sql_lab, utils
|
from superset import appbuilder, dataframe, db, jinja_context, sm, sql_lab, utils
|
||||||
from superset.connectors.sqla.models import SqlaTable
|
from superset.connectors.sqla.models import SqlaTable
|
||||||
from superset.models import core as models
|
from superset.models import core as models
|
||||||
from superset.models.sql_lab import Query
|
from superset.models.sql_lab import Query
|
||||||
|
@ -786,6 +789,22 @@ class CoreTests(SupersetTestCase):
|
||||||
{'name': ' NULL', 'sum__num': 0},
|
{'name': ' NULL', 'sum__num': 0},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_dataframe_timezone(self):
|
||||||
|
tz = psycopg2.tz.FixedOffsetTimezone(offset=60, name=None)
|
||||||
|
data = [(datetime.datetime(2017, 11, 18, 21, 53, 0, 219225, tzinfo=tz),),
|
||||||
|
(datetime.datetime(2017, 11, 18, 22, 6, 30, 61810, tzinfo=tz,),)]
|
||||||
|
df = dataframe.SupersetDataFrame(pd.DataFrame(data=list(data),
|
||||||
|
columns=['data', ]))
|
||||||
|
data = df.data
|
||||||
|
self.assertDictEqual(
|
||||||
|
data[0],
|
||||||
|
{'data': pd.Timestamp('2017-11-18 21:53:00.219225+0100', tz=tz), },
|
||||||
|
)
|
||||||
|
self.assertDictEqual(
|
||||||
|
data[1],
|
||||||
|
{'data': pd.Timestamp('2017-11-18 22:06:30.061810+0100', tz=tz), },
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Loading…
Reference in New Issue