Вы можете использовать функцию $convert
, чтобы извлечь дату из ObjectId, начиная с версии 4.0.
Что-то вроде
$convert: { input: "$_id", to: "date" }
Вы можете запросить на дату сравнения времени начала и окончания для даты.
db.collectionname.find({
"$expr":{
"$and":[
{"$gte":[{"$convert":{"input":"$_id","to":"date"}}, ISODate("2018-07-03T00:00:00.000Z")]},
{"$lte":[{"$convert":{"input":"$_id","to":"date"}}, ISODate("2018-07-03T11:59:59.999Z")]}
]
}
})
ИЛИ
Для достижения этого вы можете использовать сокращенную $toDate
.
db.collectionname.find({
"$expr":{
"$and":[
{"$gte":[{"$toDate":"$_id"}, ISODate("2018-07-03T00:00:00.000Z")]},
{"$lte":[{"$toDate":"$_id"},ISODate("2018-07-03T11:59:59.999Z")]}
]
}
})
Ваш объект timedelta преобразуется в числовое представление с помощью matplotlib. Вот почему вы не получаете дату на оси X. И сюжет идет по порядку. Просто '00:40:00'
меньше, чем во всех остальных случаях, поэтому он изображен как самая левая точка.
Вместо этого вы можете использовать формат даты и времени для включения дней, что будет означать, что 00:40:00
должно наступить последним, поскольку оно выпадет на следующий день. Вы также можете использовать метод построения панд для более удобного форматирования:
d = ({
'Time' : ['2019/1/1 7:00:00','2019/1/1 10:30:00','2019/1/1 12:40:00',
'2019/1/1 16:25:00','2019/1/1 18:30:00','2019/1/1 22:40:00',
'2019/1/2 00:40:00'],
'Value' : [1,2,3,4,5,4,10],
})
df = pd.DataFrame(d)
df['Time'] = pd.to_datetime(df['Time'])
df.plot(x='Time', y='Value')
<час> Обновление
Для установки тиканье в ваши моменты времени немного сложно. Этот пост даст вам представление о том, как работает позиционирование. По сути, вам нужно использовать что-то вроде matplotlib.dates.date2num
, чтобы получить числовое представление даты и времени:
xticks = [matplotlib.dates.date2num(x) for x in df['Time']]
xticklabels = [x.strftime('%H:%M') for x in df['Time']]
ax.set_xticks(xticks)
ax.set_xticklabels(xticklabels)