Преобразование всех строк в столбце в ISODate с использованием Python и копирование в MongoDB - PullRequest
0 голосов
/ 25 апреля 2019

Я новичок в MongoDB, поэтому, пожалуйста, помогите мне с моим вопросом. Я хочу преобразовать все мои данные даты строкового типа MongoDB в столбце с именем match_date в ISODATE и вставить их в тот же столбец (я надеюсь загрузить их в другой столбец в начале и переименовать после завершения итерации).

Но я хочу убедиться, что новый столбец имеет тип ISODATE.

В настоящее время формат строки «31.03.2009, 7:00:00»

Мне трудно понять, как он может пройти через всю коллекцию, и выполнить это преобразование и выполнить эту задачу.

Ваши ответы очень ценятся.

имя коллекции : instats_tournament_matches_transition Имя столбца : дата совпадения

Я попытался выполнить это в оболочке MongoDB, но это не сработало, поскольку мне пришлось запускать это как запланированное задание.

Я надеюсь, что результаты будут выглядеть как 2019-04-25T15: 31: 35.000Z и выполнить эту задачу в Python

import datetime
import pymongo
import dateutil.parser

def getDatetimeFromISO(s):
    d = dateutil.parser.parse(s)
    return d

conn = pymongo.MongoClient()
db = conn.sampleDB
collection = db.test
post = {
    "user" : "test1",
    "date" : getDatetimeFromISO("2016-02-10T21:56:33.000Z")
}

collection.insert_one(post)
conn.close()

1 Ответ

0 голосов
/ 26 апреля 2019

Если ваши текущие данные находятся в форме 3/31/2019 7:00:00 PM, как вы описали, вы можете проанализировать ее с помощью strptime(), как упоминалось.

from datetime import datetime

data = [
  '3/31/2019 7:00:00 PM',
  '3/30/2019 8:35:20 AM',
  '2/1/2019 11:00:00 PM',
]

for x in data:
  print(datetime.strptime(x, '%m/%d/%Y %I:%M:%S %p').isoformat())
  # 2019-03-31T19:00:00
  # 2019-03-30T08:35:20
  # 2019-02-01T23:00:00

Я не очень знаком с PyMongo и MongoDB, но думаю, что вам нужно перебрать вашу коллекцию и обновить документы с помощью нового match_date (?), Отформатированного, как указано выше.

Дикая догадка была бы что-то вроде (я не проверял это)

docs = collection.find({})

for doc in docs:
    doc['match_date'] = datetime.strptime(doc['match_date'], '%m/%d/%Y %I:%M:%S %p').isoformat()
    collection.replace_one({'_id': doc['_id']}, doc)

Но ваш пробег может отличаться.

...