boto 3 - потерять формат даты - PullRequest
       15

boto 3 - потерять формат даты

0 голосов
/ 29 сентября 2019

Я пытаюсь прочитать файл паркета, используя boto3.Исходный файл имеет даты в следующем формате:

2016-12-07 23:00:00.000

И они хранятся как метки времени.

Мой код в Sage Maker:

boto_s3 = boto3.client('s3') 
r = boto_s3.select_object_content(
        Bucket='bucket_name',
        Key='path/file.gz.parquet',
        ExpressionType='SQL',
        Expression=f"select fecha_instalacion,pais from s3object s ",
        InputSerialization = {'Parquet': {}},
        OutputSerialization = {'CSV': {}},
)


rl0 = list(r['Payload'])[0]

from io import StringIO
string_csv = rl0['Records']['Payload'].decode('ISO-8859-1')
csv = StringIO(string_csv)
pd.read_csv(csv, names=['fecha_instalacion',  'pais'])

Но вместо этогодаты, которую я получаю:

fecha_instalacion  pais
45352962065516692798029824  ESPAÃA

Я перебрал даты, у которых только один день между ними, и число одинаковых цифр - первые 6. Как пример:

45337153205849123712294912-->   2016-12-09 23:00:00.000
45337116312360976293191680-->   2016-12-07 23:00:00.000

Мне нужно получить правильную форматированную дату и избегать особых символов.

Спасибо.

1 Ответ

0 голосов
/ 29 сентября 2019

Проблема в формате.Этот файл Parquet использует числа Int96 для представления метки времени.

Вот функция для преобразования int96Timestamp в python DateTime

import datetime

def dateFromInt96Timestamp(int96Timestamp):
    julianCalendarDays = int96Timestamp >> 8*8
    time = int((int96Timestamp & 0xFFFFFFFFFFFFFFFF) / 1_000)
    linuxEpoch = 2_440_588
    return datetime.datetime(1970, 1, 1) + datetime.timedelta(days=julianCalendarDays - linuxEpoch, microseconds=time)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...