mirror of
https://github.com/apache/arrow.git
synced 2026-10-29 09:05:47 +08:00
ARROW-1883: [Python] Fix handling of metadata in to_pandas when not all columns are present
This commit is contained in:
1 parent
6ec4f343ba
commit
306eaba3c1
2 files changed
+38
-10
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user