我正在写一个程序,用Python语言将数据从MySQL传输到MongoDB。但是,我无法将时间数据类型转换为MongoDB:- MySQL端有一个示例格式的时间数据字段:'18: 59: 32.521177‘(“小时:分钟:秒:毫秒”)我想问一下MongoDB中上述字段对应的数据类型是什么?如何使用python进行转换?
发布于 2019-05-22 04:05:22
mongodb中没有time类型,只有datetime类型。如果您真的只使用时间,而根本不关心日期组件,我建议将日期组件设置为1-jan-1 (year 1)作为标记。在您的示例中,521177
看起来是以微秒为单位的,而不是毫秒,因此它将直接进入python datetime
对象:
# Get your time object from MySQL and extract hour, mins, secs, and microseconds.
# Then, construct a full datetime with the marker date:
d7 = datetime.datetime(1, 1, 1, 18, 59, 32, 521177)
db.foo.insert({"myDate": d7});
db.foo.find();
{ "_id" : ObjectId("5ce45553283c3282ad1cec34"), "myDate" : ISODate("0001-01-01T18:59:32.521Z") }
请注意,MongoDB datetime
的时间分量仅对millis准确。如果您需要捕获micros,则必须将其存储在对等字段中,例如
micros = 521177
d7 = datetime.datetime(1, 1, 1, 18, 59, 32, micros)
db.foo.insert({"myDate": d7, "micros": micros});
或者利用丰富的类型,创建一个小的date+micros结构:
micros = 521177
d7 = datetime.datetime(1, 1, 1, 18, 59, 32, micros)
db.foo.insert({"myDate": {"d":d7, "micros": micros}});
这样,您就可以轻松地携带这两部分数据:
db.foo.findOne({}, {"myDate":1} );
{
"_id" : ObjectId("5ce457df283c3282c43a79b7"),
"myDate" : {
"micros" : 521177,
"d" : ISODate("0001-01-01T18:59:32.521Z")
}
}
在任何情况下,您都可以直接在从MongoDB获取的date对象上使用python datetime
的timedelta
特性。使用1-Jan-1约定,日期差异将始终为零,从而产生时间差异--尽管只对millis准确:
micros = 521177
d7 = datetime.datetime(1, 1, 1, 18, 59, 32, micros)
db.foo.insert({"_id":0, "myDate": {"d":d7, "micros": micros}});
micros += 3780 # jump ahead in time a bit....
d7 = datetime.datetime(1, 1, 1, 18, 59, 32, micros)
db.foo.insert({"_id":1, "myDate": {"d":d7, "micros": micros}});
doc1 = db.foo.find_one({"_id":0});
doc2 = db.foo.find_one({"_id":1});
delta = doc2['myDate']['d'] - doc1['myDate']['d']
print "delta: ", delta
delta: 0:00:00.003000
当然,你可以通过添加micros模1000来获得完全保真度,以获得不属于millis的micros,这些micros已经与日期一起存储:
adj1 = doc1['myDate']['d'] + datetime.timedelta(microseconds=doc1['myDate']['micros'] % 1000)
adj2 = doc2['myDate']['d'] + datetime.timedelta(microseconds=doc2['myDate']['micros'] % 1000)
delta = adj2 - adj1
print "delta: ", delta
delta: 0:00:00.003780
当然,如果您决定使用迷你结构来携带datetime+micros,那么将调用一个函数:
def mdb2py(minidatestruct):
return minidatestruct['d'] + datetime.timedelta(microseconds=minidatestruct['micros'] % 1000)
adj1 = mdb2py(doc1['myDate'])
adj2 = mdb2py(doc2['myDate'])
delta = adj2 - adj1
print "delta: ", delta
delta: 0:00:00.003780
https://stackoverflow.com/questions/56242073
复制相似问题