Python MongoDB中的时间数据类型?

Python MongoDB中的时间数据类型?,python,mongodb,pymongo,Python,Mongodb,Pymongo,我正在编写一个程序,用python将数据从MySQL传输到MongoDB。但是,我无法将时间数据类型传输到MongoDB: -MySQL端有一个示例格式的时间数据字段:“18:59:32.521177”(“小时:分钟:秒:毫秒”) 我想在MongoDB中询问上述字段对应的数据类型是什么?如何使用python转换它?mongodb中没有时间类型,只有datetime。如果您确实只使用时间,而根本不关心日期组件,我建议将日期组件设置为1-jan-1(第一年)作为标记。在您的示例中,521177看起来

我正在编写一个程序,用python将数据从MySQL传输到MongoDB。但是,我无法将时间数据类型传输到MongoDB: -MySQL端有一个示例格式的时间数据字段:“18:59:32.521177”(“小时:分钟:秒:毫秒”)
我想在MongoDB中询问上述字段对应的数据类型是什么?如何使用python转换它?

mongodb中没有时间类型,只有datetime。如果您确实只使用时间,而根本不关心日期组件,我建议将日期组件设置为1-jan-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
的时间分量仅精确到毫秒。如果需要捕获micro,则必须将其存储在对等字段中,例如

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获取的日期对象使用python的
timedelta
功能。在1-Jan-1约定中,日期差始终为零,从而产生时间差——尽管精确到毫秒:

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
当然,您可以通过添加微秒模1000来获得完整的保真度,以获得不属于已存储日期的毫秒的微秒:

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
当然,如果您决定使用mini struct来携带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

您可以将数据保留为字符串并进行对话:

  • 从字符串到日期:
  • 从日期到日期:

请参考MongoDB文档以回答以下问题:@Column01非常感谢!!你的回答非常完整,我非常感激!!然后继续并向上箭头+1.:-)
your_datatime = datetime.strptime(your_str_datatime, "%Y-%m-%dT%H:%M:%SZ")
your_str_datatime = your_datatime.strftime("%Y-%m-%dT%H:%M:%SZ")