Сохранить столбец даты с NAT (null) от pandas до паркета - PullRequest
1 голос
/ 14 июля 2020

Мне нужно прочитать значения даты, допускающие значение NULL, в целочисленном формате ('ГГГГММДД') до pandas, а затем сохранить этот pandas фрейм данных в Parquet как формат Date32 [Day], чтобы классификатор Athena Glue Crawler распознал этот столбец как свидание. Приведенный ниже код не позволяет мне сохранить столбец в паркет из pandas:

import pandas as pd

dates = [None, "20200710", "20200711", "20200712"]
data_df = pd.DataFrame(dates, columns=['date'])
data_df['date'] = pd.to_datetime(data_df['date']).dt.date
data_df.to_parquet(r'my_path', engine='pyarrow')

Я получаю эту ошибку ниже:

Traceback (most recent call last):
  File "", line 123, in convert_column
    result = pa.array(col, type=type_, from_pandas=True, safe=safe)
  File "pyarrow\array.pxi", line 265, in pyarrow.lib.array
  File "pyarrow\array.pxi", line 80, in pyarrow.lib._ndarray_to_array
TypeError: an integer is required (got type datetime.date)

Если я перемещаю значение None ближе к концу списка дат это будет работать без каких-либо проблем, и pyarrow выведет столбец даты как Date32[Day]. Я предполагаю, что, поскольку тип столбца Pandas для dt.date равен object плюс первое значение столбца NaT (не время), pyarrow не может вывести столбец как Date32[Day] из Pandas dataframe или некоторое примерное значение, вместо этого он выводит столбец как Integer. Каков хороший способ сохранить этот столбец фрейма данных в паркет как столбец Date32[Day] без сортировки значений столбца? Спасибо.

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вы правы. Поскольку первое значение - NaT, вам нужно удалить его, не меняя тип данных. Я использовал приведенный ниже код.

import pandas as pd

dates = [None, "20200710", "20200711", "20200712"]
data_df = pd.DataFrame(dates, columns=['date'])
data_df['date'] = pd.to_datetime(data_df['date']).dt.date

# In addition, add this line to remove NaT without changing type
# Change strfttime as you want (I have used YMD)
data_df['date'] = [d.strftime('%Y-%m-%d') if not pd.isnull(d) else '' for d in data_df['date']]

data_df.to_parquet(r'my_path', engine='pyarrow')

Надеюсь, это сработает для вас и ошибка устранена.

0 голосов
/ 10 августа 2020

Это была ошибка, которая исправлена ​​в pyarrow 1.0 (https://issues.apache.org/jira/browse/ARROW-842 / https://github.com/apache/arrow/pull/7537). Фрагмент сверху теперь работает нормально:

In [2]: dates = [None, "20200710", "20200711", "20200712"] 
   ...: data_df = pd.DataFrame(dates, columns=['date']) 
   ...: data_df['date'] = pd.to_datetime(data_df['date']).dt.date                                                                                                                                                  

In [3]: data_df                                                                                                                                                                                                    
Out[3]: 
         date
0         NaT
1  2020-07-10
2  2020-07-11
3  2020-07-12

In [4]: data_df.to_parquet(r'my_path', engine='pyarrow')                                                                                                                                                           

In [5]: import pyarrow.parquet as pq                                                                                                                                                                               

In [6]: pq.read_table(r'my_path')                                                                                                                                                                                  
Out[6]: 
pyarrow.Table
date: date32[day]
...