ARROW-1883: [Python] Fix handling of metadata in to_pandas when not all columns are present

This commit is contained in:
Joris Van den Bossche committed 2017-12-04 14:33:39 +01:00
1 parent 6ec4f343ba
commit 306eaba3c1
2 files changed
+38 -10

No files matched your search

+23 -10
View File
@@ -530,19 +530,32 @@ def _add_any_metadata(table, pandas_metadata):
schema = table.schema
n_index_levels = len(pandas_metadata['index_columns'])
n_columns = len(pandas_metadata['columns']) - n_index_levels
# Add time zones
for i, col_meta in enumerate(pandas_metadata['columns']):
if col_meta['pandas_type'] == 'datetimetz':
col = table[i]
converted = col.to_pandas()
tz = col_meta['metadata']['timezone']
tz_aware_type = pa.timestamp('ns', tz=tz)
with_metadata = pa.Array.from_pandas(converted.values,
type=tz_aware_type)
field = pa.field(schema[i].name, tz_aware_type)
modified_columns[i] = pa.Column.from_array(field,
with_metadata)
raw_name = col_meta['name']
if i >= n_columns:
# index columns
raw_name = pandas_metadata['index_columns'][i - n_columns]
if raw_name is None:
raw_name = 'None'
idx = schema.get_field_index(raw_name)
if idx != -1:
if col_meta['pandas_type'] == 'datetimetz':
col = table[idx]
converted = col.to_pandas()
tz = col_meta['metadata']['timezone']
tz_aware_type = pa.timestamp('ns', tz=tz)
with_metadata = pa.Array.from_pandas(converted.values,
type=tz_aware_type)
field = pa.field(schema[idx].name, tz_aware_type)
modified_columns[idx] = pa.Column.from_array(field,
with_metadata)
if len(modified_columns) > 0:
columns = []
@@ -1221,6 +1221,21 @@ class TestPandasConversion(object):
assert pa.Array.from_pandas(expected,
type=pa.list_(t())).equals(result)
def test_table_column_subset_metadata(self):
# ARROW-1883
df = pd.DataFrame({
'a': [1, 2, 3],
'b': pd.date_range("2017-01-01", periods=3, tz='Europe/Brussels')})
table = pa.Table.from_pandas(df)
table_subset = table.remove_column(1)
result = table_subset.to_pandas()
tm.assert_frame_equal(result, df[['a']])
table_subset2 = table.remove_column(1)
result = table_subset2.to_pandas()
tm.assert_frame_equal(result, df[['a']])
def _pytime_from_micros(val):
microseconds = val % 1000000