【问题标题】:How to fix the date and time fields Pymongo如何修复日期和时间字段 Pymongo
【发布时间】:2021-05-26 23:52:59
【问题描述】:

当我将数据导入 mongodb 时,我得到了这个:

    _id:object("603678958a6eade21c0790b8")
    id1:3758
    date2:2010-01-01T00:00:00.000+00:00
    time3:1900-01-01T00:05:00.000+00:00
    date4 :2009-12-31T00:00:00.000+00:00
    time5:1900-01-01T19:05:00.000+00:00
    id6 :2
    id7:-79.09
    id8:35.97
    id9:5.5
    id10:0
    id11:-99999
    id12 :0
    id13 :-9999
    c14:"U"
    id15:0
    id16:99
    id17:0
    id18:-99
    id19:-9999
    id20:33
    id21:0
    id22:-99
    id23:0

理想应该是这样的:

    _id:object("603678958a6eade21c0790b8")
    id1:3758
    date2:2010-01-01
    time3:00:05:00
    date4 :2009-12-31
    time5:19:05:00
    id6 :2
    id7:-79.09
    id8:35.97
    id9:5.5
    id10:0
    id11:-99999
    id12 :0
    id13 :-9999
    c14:"U"
    id15:0
    id16:99
    id17:0
    id18:-99
    id19:-9999
    id20:33
    id21:0
    id22:-99
    id23:0

我用来将列 date2,date4,time3,time5 转换为日期和时间的代码是这样的:

    df['date4'] = df['date4'].astype('datetime64[ns]') 
    df['date2'] = df['date2'].astype('datetime64[ns]') 

    
    df['time3'] = df['time3'].apply(lambda x:datetime.datetime.strptime(x[0]+x[1]+":"+x[2]+x[3], '%H:%M'))
    df['time5'] = df['time5'].apply( lambda x: datetime.datetime.strptime(x[0] + x[1] + ":" + x[2] + x[3], '%H:%M'))

我尝试了其他一些方法,例如 datetime.datetime,但似乎没有任何效果 有谁知道我该如何解决这个问题?

【问题讨论】:

  • 我对 Mongo 的体验是,它们只有一种数据格式,并且是 ISO 标准。里面有日期+时间。我只有一个时间戳对象,其中有多个时间戳,您可以使用 datetime(year, month, day, hour, min sec) 为您想要的任何日期/小时创建该格式。
  • 如果你想要触发器或类似的东西,你可以将它们作为字符串插入,而不是?

标签: python pandas mongodb datetime time


【解决方案1】:

strptime 从字符串创建日期时间对象。

strftime 通过从日期时间创建字符串来做相反的事情

因为你有一个字符串,你实际上会想要同时使用这两个对象,然后你将创建一个日期时间对象,然后在字符串中再次解析它,但使用所需的格式

如果您有 python 3.7,您可以使用 datetime.datetime.fromisoformat 将您的字符串转换为日期时间对象

您可以在How to parse an isoformat to a datatime object上阅读更多内容

df = pd.DataFrame([{
    "_id": "603678958a6eade21c0790b8",
    "date2": "2010-01-01T00:00:00.000+00:00",
    "time3": "1900-01-01T00:05:00.000+00:00",
    "date4": "2009-12-31T00:00:00.000+00:00",
    "time5": "1900-01-01T19:05:00.000+00:00",
}])
df['date4'] = df['date4'].apply(lambda x: datetime.datetime.strftime(datetime.datetime.fromisoformat(x), '%Y-%M-%d'))
df['date2'] = df['date2'].apply(lambda x: datetime.datetime.strftime(datetime.datetime.fromisoformat(x), '%Y-%M-%d'))
df['time3'] = df['time3'].apply(lambda x: datetime.datetime.strftime(datetime.datetime.fromisoformat(x), '%H:%M:%S'))
df['time5'] = df['time5'].apply(lambda x: datetime.datetime.strftime(datetime.datetime.fromisoformat(x), '%H:%M:%S'))

输出:

date2                2010-00-01
date4                2009-00-31
time3                  00:05:00
time5                  19:05:00

要获得更易读的代码,您可以像这样导入您的包: from datetime import datetime

from datetime import datetime
df['date4'] = df['date4'].apply(lambda x: datetime.strftime(datetime.fromisoformat(x), '%Y-%M-%d'))
df['date2'] = df['date2'].apply(lambda x: datetime.strftime(datetime.fromisoformat(x), '%Y-%M-%d'))
df['time3'] = df['time3'].apply(lambda x: datetime.strftime(datetime.fromisoformat(x), '%H:%M:%S'))
df['time5'] = df['time5'].apply(lambda x: datetime.strftime(datetime.fromisoformat(x), '%H:%M:%S'))

我个人习惯于使用arrow 包来操作日期。 这是这个包的代码:

import arrow
df['date2'] = df['date2'].apply(lambda x: arrow.get(x).format("YYYY-MM-DD"))
df['date4'] = df['date4'].apply(lambda x: arrow.get(x).format("YYYY-MM-DD"))
df['time3'] = df['time3'].apply(lambda x: arrow.get(x).format("HH:mm:ss"))
df['time5'] = df['time5'].apply(lambda x: arrow.get(x).format("HH:mm:ss"))

提供相同的输出

【讨论】:

  • @AlexisG。非常感谢。它就像一个魅力
  • 不客气。您可以将答案标记为已接受,以“关闭”问题
  • 我想保留你给我的日期和时间格式,但我不希望它们的类型都是字符串,我想成为 date2、date4 和 time 的日期时间3,时间5。这可能吗?你知道我该怎么做吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多