Преобразовать строку в Python даты ISO

Я использую postgresql. На нем у меня есть данные, которые я должен использовать на питоне. Одно поле таблицы содержит дату. Это выглядит так:

введите здесь описание изображения

В моем скрипте Python с использованием psycopg2 я получаю результаты, когда я получаю дату, она сохраняется в виде строки в mongodb

"created" : "2016-06-16T19:53:43.776456"

Мой код выглядит так:

query = "SELECT name, created FROM user;"
cur.execute(query)
user_data = cur.fetchall()
for user_info in user_data:
    user_json = {
       'name': user_info[0],
       'created': user_info[1]
    }

Я хочу преобразовать это "created" : "2016-06-16T19:53:43.776456" в "created" : ISODate("2016-06-24T09:08:09.333Z"), но я не знаю, как преобразовать его в правильный формат. Пожалуйста помоги!


person Babel    schedule 28.06.2016    source источник
comment
Откуда я должен импортировать `to_char`   -  person Babel    schedule 29.06.2016
comment
to_char — это функция PostgreSQL. В моем примере выше запрос создает готовые к использованию JSON. Вы можете использовать его так, как вы указали, например: query = "SELECT name, to_char(created, '\"ISODate\"(YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\")') FROM user;"   -  person Abelisto    schedule 29.06.2016
comment
выполнение этого дает эту ошибку HINT: No function matches the given name and argument types. You might need to add explicit type casts. почему это может быть?   -  person Babel    schedule 29.06.2016


Ответы (2)


IMO вам не нужно указывать ISODate при сохранении данных в MongoDB.

Код Python (фрагмент):

cur.execute("select name, created from tt_user;")
data = cur.fetchall()
for row in data:
    print(row[0], row[1])
    mdr = {
        'user': row[0],
        'created': row[1]
    }
    mongo_db.tt_user.insert_one(mdr)
print("Done.")

print("Check data in MongoDB");

for row in mongo_db.tt_user.find():
    print(row)

и его вывод:

Load data from PostgreSQL into MongoDB...
('user1', datetime.datetime(2016, 6, 29, 13, 26, 28, 632436, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=180, name=None)))
('user2', datetime.datetime(2016, 6, 29, 13, 26, 28, 632739, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=180, name=None)))
('user3', datetime.datetime(2016, 6, 29, 13, 26, 28, 632751, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=180, name=None)))
('user4', datetime.datetime(2016, 6, 29, 13, 26, 28, 632757, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=180, name=None)))
('user5', datetime.datetime(2016, 6, 29, 13, 26, 28, 632762, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=180, name=None)))
Done.
Check data in MongoDB....
{u'_id': ObjectId('5773a254afd34b43d76aa792'), u'user': u'user1', u'created': datetime.datetime(2016, 6, 29, 10, 26, 28, 632000)}
{u'_id': ObjectId('5773a255afd34b43d76aa793'), u'user': u'user2', u'created': datetime.datetime(2016, 6, 29, 10, 26, 28, 632000)}
{u'_id': ObjectId('5773a255afd34b43d76aa794'), u'user': u'user3', u'created': datetime.datetime(2016, 6, 29, 10, 26, 28, 632000)}
{u'_id': ObjectId('5773a255afd34b43d76aa795'), u'user': u'user4', u'created': datetime.datetime(2016, 6, 29, 10, 26, 28, 632000)}
{u'_id': ObjectId('5773a255afd34b43d76aa796'), u'user': u'user5', u'created': datetime.datetime(2016, 6, 29, 10, 26, 28, 632000)}

И в консоли MongoDB:

> db.tt_user.find()
{ "_id" : ObjectId("5773a254afd34b43d76aa792"), "user" : "user1", "created" : ISODate("2016-06-29T10:26:28.632Z") }
{ "_id" : ObjectId("5773a255afd34b43d76aa793"), "user" : "user2", "created" : ISODate("2016-06-29T10:26:28.632Z") }
{ "_id" : ObjectId("5773a255afd34b43d76aa794"), "user" : "user3", "created" : ISODate("2016-06-29T10:26:28.632Z") }
{ "_id" : ObjectId("5773a255afd34b43d76aa795"), "user" : "user4", "created" : ISODate("2016-06-29T10:26:28.632Z") }
{ "_id" : ObjectId("5773a255afd34b43d76aa796"), "user" : "user5", "created" : ISODate("2016-06-29T10:26:28.632Z") }
> 

Так что это поведение клиентского программного обеспечения, а не проблема с хранилищем. Просто сохраните данные как datetime.

PS: Спасибо, что заставили меня наконец-то установить MongoDB :)

person Abelisto    schedule 29.06.2016
comment
Спасибо за ваш ответ. Когда я печатаю элемент из результатов, я получаю это ("abc", '2016-06-15T16:58:19.465608'), поэтому моя дата там обрабатывается как строка, для этого, когда я делаю 'created': row[1], она сохраняется вот так "created" : "2016-06-16T19:53:43.776456", поэтому для меня это не работает так - person Babel; 29.06.2016
comment
@Egzona Предоставить user таблицу DDL (создать скрипт). - person Abelisto; 29.06.2016
comment
@Egzona Я думаю, что вы сохраняете значения даты/времени в виде строки вместо типа datetime. Попробуйте преобразовать их при создании объекта JSON. - person Abelisto; 29.06.2016
comment
Кажется, я не могу его изменить, но могу ли я преобразовать его из строки в дату ISO в python следующим образом: string_date = "2016-06-16T19:53:43.776456" datetime_date = datetime.datetime.strptime(string_date, "%Y-%m-%d %H:%M:%S.%f") var = { "date" : datetime_date} return var - person Babel; 29.06.2016
comment
@Egzona Точно, но измените шаблон в соответствии с вашим значением (T пропущено): "%Y-%m-%dT%H:%M:%S.%f" - person Abelisto; 29.06.2016
comment
@Egzona Кстати, это была моя вторая программа на Python и мой первый опыт работы с MongoDB :о) Удачи. - person Abelisto; 29.06.2016

Замените это

query = "SELECT name, created FROM user;"

этим

query = "SELECT name, 'ISODate(\"' || created || '\")' FROM user;"

Запрос вернет правильно сформированную строку, которую вы хотите сохранить как created.

person cachique    schedule 28.06.2016
comment
Это сохраняет дату в виде строки, как это "created" : "ISODate(\"2016-06-17T14:30:35.906396\")" - person Babel; 29.06.2016
comment
Я не привык к psycopg2 и python. Вам нужно правильно экранировать кавычки и двойные кавычки, чтобы SELECT name, 'ISODate("' || created || '")' FROM user; было назначено query var и предоставить это в качестве аргумента execute() - person cachique; 29.06.2016