如何把python 字符串转换为utc时间?

葉開
  • 7

问题:如何把string转换为utc格式时间?

如何把字符串‘20181221’,转换为
目标格式:"2018-12-21T00:00:00.000Z"

已尝试过

from dateutil.parser import parse
import dateutil
a = parse('20181222').isoformat()
print(a)

无法获取有000.Z的格式

之前直接使用parse函数,代码如下:

from dateutil.parser import parse
import dateutil
a = parse('20181222')

然后存入mongodb中,会自动保存为包含000.Z格式

笔者最终是希望把pandas中的DataFrame的数据传到mongodb中,
可由于之前的资料日期格式为"2018-12-21T00:00:00.000Z",
现在只能得到‘2018-12-22T00:00:00' ,
求问如何能把字符串’20181221‘转换为"2018-12-21T00:00:00.000Z",
不胜感激!

其他方法也尝试过,依然无法得到想要的格式。

import arrow
arrow.get('20181221').datetime

以及

import dateutil
u = dateutil.tz.tzutc()
u2 = dateutil.tz.gettz('America/Chicago')
date1 = datetime.datetime(2010,5,2,11,10,tzinfo=u)
date2 = datetime.datetime(2010,5,2,11,10,tzinfo=u2)
回复
阅读 3.1k
4 个回答

后来测试了很多方法,目前已经解决,方法如下:
总结:问题主要出现在直接用pandas读取csv,生成的DataFrame传输到mongodb中不会把时间变成isoDate格式(在我的电脑是这样,其他人不知道会不会)

方法一(可行,但麻烦)
1.通过第三方库:

from dateutil.parser import parse

来转换获得的格式,用pymongo导入mongodb中后,格式不是isoDate格式(这个时候可以通过进入数据库中,输入

#mongo进入需要修改的数据库中
db.pytest.find().forEach(function(element){
  element.OrderDate = ISODate(element.OrderDate);
  db.pytest.save(element);
});

可以得到isoDate,但太麻烦了……

2.通过第三方库(pendulum)

from pendulum.parser import parse

来进行格式转换,
在pandas中会出现以下反馈:'DateTime' object has no attribute 'nanosecond'
这个问题目前还不明白是什么问题。

3.最终解决方案:
1.pandas读取csv后,把时间列的值重新替换,例如:

import pandas as pd
from dateutil.parser import parse
df = pd.read_csv('test.csv')
df['日期'] = parse('20181226')
data = df.to_dict(orient='records')

#然后把data的数据导入mongodb中,即可获得isoDate的数据

原因:直接用pandas读取csv,获取的时间数据后,导入mongodb,但是格式不是isoDate格式。

from datetime import datetime

time1 = datetime(year=2018,month=12, day=21)
time2 = time1.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
print(time2)
# 打印结果是 2018-12-21T00:00:00.000000Z

从python的datetime 到 mongodb 的isodate 的格式转化主要有两个麻烦:

  1. python datetime.strftime() 支持到微秒输出(%f),但不支持毫秒, isoformat 也是秒后取微秒精度。而MongoDB秒后面是三位毫秒
  2. MongoDB iosdateios 以'Z' 表示utc时区缩写,python datetime.isoformat() 用偏移量 +00:00 表示

我觉得不妨参考datatime.py的 iosformat 实现,自己写一个。

datetime模块自带微秒输出的功能:

>>> source='2018-08-01'
>>> import datetime as dt
>>> my_dt=dt.datetime.fromisoformat(source)
>>> my_dt.isoformat(timespec='milliseconds')+'Z'
'2018-08-01T00:00:00.000Z'
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏