Skip to content

Commit 0ceb40f

Browse files
committed
fixup! ENH: Added to_json_schema
1 parent 57e9836 commit 0ceb40f

File tree

2 files changed

+30
-12
lines changed

2 files changed

+30
-12
lines changed

pandas/io/json/table_schema.py

+13-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"""
66
from collections import OrderedDict
77

8+
from pandas.compat import string_types
89
from pandas.types.common import (
910
is_integer_dtype, is_timedelta64_dtype, is_numeric_dtype,
1011
is_bool_dtype, is_datetime64_dtype, is_datetime64tz_dtype,
@@ -78,7 +79,17 @@ def _set_default_names(data):
7879

7980
def _make_field(arr, dtype=None):
8081
dtype = dtype or arr.dtype
81-
field = OrderedDict([("name", arr.name or 'values'),
82+
if arr.name is None:
83+
name = 'values'
84+
elif isinstance(arr.name, string_types):
85+
name = arr.name
86+
elif hasattr(arr.name, 'isoformat'):
87+
# Timestamps / Timedeltas aren't
88+
name = arr.name.isoformat()
89+
else:
90+
name = arr.name
91+
92+
field = OrderedDict([("name", name),
8293
('type', _as_json_table_type(dtype))])
8394
if is_categorical_dtype(arr):
8495
if hasattr(arr, 'categories'):
@@ -166,9 +177,8 @@ def build_table_schema(data, index=True, primary_key=None, version=True):
166177

167178
schema['fields'] = fields
168179
if index and data.index.is_unique and primary_key is None:
169-
# TODO: Always a list, spec allows for a string scalar.
170180
if data.index.nlevels == 1:
171-
schema['primaryKey'] = data.index.name
181+
schema['primaryKey'] = [data.index.name]
172182
else:
173183
schema['primaryKey'] = data.index.names
174184
elif primary_key is not None:

pandas/io/tests/json/test_json_table_schema.py renamed to pandas/tests/io/json/test_json_table_schema.py

+17-9
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def test_build_table_schema(self):
3333
{'name': 'C', 'type': 'datetime'},
3434
{'name': 'D', 'type': 'duration'},
3535
],
36-
'primaryKey': 'idx'
36+
'primaryKey': ['idx']
3737
}
3838
self.assertEqual(result, expected)
3939
result = build_table_schema(self.df)
@@ -44,7 +44,7 @@ def test_series(self):
4444
result = build_table_schema(s, version=False)
4545
expected = {'fields': [{'name': 'index', 'type': 'integer'},
4646
{'name': 'foo', 'type': 'integer'}],
47-
'primaryKey': 'index'}
47+
'primaryKey': ['index']}
4848
self.assertEqual(result, expected)
4949
result = build_table_schema(s)
5050
self.assertTrue('pandas_version' in result)
@@ -53,7 +53,7 @@ def tets_series_unnamed(self):
5353
result = build_table_schema(pd.Series([1, 2, 3]), version=False)
5454
expected = {'fields': [{'name': 'index', 'type': 'integer'},
5555
{'name': 'values', 'type': 'integer'}],
56-
'primaryKey': 'index'}
56+
'primaryKey': ['index']}
5757
self.assertEqual(result, expected)
5858

5959
def test_multiindex(self):
@@ -197,7 +197,7 @@ def test_build_series(self):
197197
OrderedDict([('name', 'a'), ('type', 'integer')])]
198198
schema = OrderedDict([
199199
('fields', fields),
200-
('primaryKey', 'id'),
200+
('primaryKey', ['id']),
201201
])
202202

203203
expected = OrderedDict([
@@ -236,7 +236,7 @@ def test_to_json(self):
236236

237237
schema = OrderedDict([
238238
('fields', fields),
239-
('primaryKey', 'idx'),
239+
('primaryKey', ['idx']),
240240
])
241241
data = [
242242
OrderedDict([('idx', 0), ('A', 1), ('B', 'a'),
@@ -280,7 +280,7 @@ def test_to_json_float_index(self):
280280
('type', 'number')]),
281281
OrderedDict([('name', 'values'),
282282
('type', 'integer')])]),
283-
('primaryKey', 'index')])),
283+
('primaryKey', ['index'])])),
284284
('data',
285285
[OrderedDict([('index', 1.0), ('values', 1)]),
286286
OrderedDict([('index', 2.0), ('values', 1)])])])
@@ -302,7 +302,7 @@ def test_to_json_period_index(self):
302302
('freq', 'Q-JAN')]),
303303
OrderedDict([('name', 'values'),
304304
('type', 'integer')])]),
305-
('primaryKey', 'index')])),
305+
('primaryKey', ['index'])])),
306306
('data', [
307307
OrderedDict([('index',
308308
'2015-11-01T00:00:00.000Z'),
@@ -330,7 +330,7 @@ def test_to_json_categorical_index(self):
330330
('ordered', False)]),
331331
OrderedDict([('name', 'values'),
332332
('type', 'integer')])]),
333-
('primaryKey', 'index')])),
333+
('primaryKey', ['index'])])),
334334
('data', [
335335
OrderedDict([('index', 'a'),
336336
('values', 1)]),
@@ -418,7 +418,7 @@ def test_categorical(self):
418418

419419
expected = OrderedDict([
420420
('schema', OrderedDict([
421-
('fields', fields), ('primaryKey', 'idx')])),
421+
('fields', fields), ('primaryKey', ['idx'])])),
422422
('data', [OrderedDict([('idx', 0), ('values', 'a')]),
423423
OrderedDict([('idx', 1), ('values', 'b')]),
424424
OrderedDict([('idx', 2), ('values', 'a')])])])
@@ -453,3 +453,11 @@ def test_set_default_names_mi_partion(self):
453453
names=['n1', None]))
454454
result = _set_default_names(data)
455455
self.assertEqual(result.index.names, ['n1', 'level_1'])
456+
457+
def test_timestamp_in_columns(self):
458+
df = pd.DataFrame([[1, 2]], columns=[pd.Timestamp('2016'),
459+
pd.Timedelta(10, unit='s')])
460+
result = df.to_json(orient="table")
461+
js = json.loads(result)
462+
assert js['schema']['fields'][1]['name'] == '2016-01-01T00:00:00'
463+
assert js['schema']['fields'][2]['name'] == 'P0DT0H0M10S'

0 commit comments

Comments
 (0)