pymon go конвертирует дату mongoDB в python datetime - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть база данных MongoDB, в которой есть некоторые записи времени (например, даты создания некоторых объектов). Когда я смотрю на них в базе данных, они, кажется, в 64-битном целочисленном формате BSON. Запись базы данных была изначально создана с использованием C# (ASP. NET Core) с использованием следующего представления:

[BsonRepresentation(MongoDB.Bson.BsonType.Decimal128)]

Я хочу получить доступ к этой базе данных с помощью сценария Python, чтобы получить статистику , Я могу получить эту запись в моем python коде, используя pymongo. Типичное значение выглядит так: [637013892303590646, 0]. Как я могу преобразовать его в python datetime значение, удобное для чтения человеком?

Если я печатаю переменный тип, который я получаю из pymon go, он говорит: bson.int64.Int64

Я посмотрел документацию по модулю bson здесь: https://api.mongodb.com/python/current/api/bson/index.html, но не смог найти подходящую функцию для преобразования. Может кто-нибудь указать мне правильный вызов для преобразования bson.int64.Int64 в datetime значение?

Спасибо!

1 Ответ

1 голос
/ 11 февраля 2020

Ваши данные в тиках ; определяется как:

Значение этого свойства представляет количество интервалов в 100 наносекунд, прошедших с 12:00:00 до полуночи 1 января 0001 года в григорианском календаре, которое представляет MinValue. Он не включает количество тиков, которые относятся к високосным секундам. Если для объекта DateTime свойство Kind имеет значение Local, его отметки представляют время, прошедшее с 12:00:00 до полуночи 1 января 0001 года по местному времени, как указано в текущей настройке часового пояса. Если объект DateTime имеет свойство Kind, установленное в Ut c, его отметки представляют время, прошедшее с 12:00:00 до полуночи 1 января 0001 года по всемирному координированному времени. Если объект DateTime имеет свойство Kind, установленное в значение Unspecified, его отметки представляют время, прошедшее с 12:00:00 полуночи 1 января 0001 г. в неизвестном часовом поясе.

, поэтому мы можем написать ticks_to_datetime() функция, которая использует временную дельту, основанную на полуночи 1 января 0101 года, деленную на 10 для преобразования из 100 наносекунд в микросекунды.

import pymongo
from datetime import datetime, timedelta
from bson import Int64

def ticks_to_datetime(ticks):
    return datetime(1, 1, 1) + timedelta(microseconds=ticks / 10)

mydb = pymongo.MongoClient()['mydatabase']

mydb.mycollection.insert_one({'old_time': [Int64(637013892303590646), 0]})
record = mydb.mycollection.find_one({})
old_time = record['old_time'][0]
new_time = ticks_to_datetime(old_time)
print(new_time)

дает:

2019-08-14 14:20:30.359062
...