我有一个使用IPDDump创建的Blackberry IPD备份的CSV转储文件.这里的日期/时间字符串看起来像这样(EST澳大利亚时区在哪里):
Tue Jun 22 07:46:22 EST 2010
Run Code Online (Sandbox Code Playgroud)
我需要能够在Python中解析这个日期.起初,我尝试使用strptime()datettime中的函数.
>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')
Run Code Online (Sandbox Code Playgroud)
但是,由于某种原因,返回的datetime对象似乎没有任何tzinfo关联它.
我在这个页面上读到的显然是datetime.strptime默默地丢弃了tzinfo,但是,我检查了文档,我找不到任何有关此处记录的效果.
我已经能够使用第三方Python库dateutil来解析日期,但是我仍然很好奇我是如何使用内置strptime()错误的?有什么方法可以strptime()很好地与时区玩吗?
我有以下字符串"2017-03-30 08:25:00CET",我想将其转换为日期时间tz感知对象.
根据这个问题,从python 3.2可以只使用datetime模块完成.另外,从文档中我看到了
Run Code Online (Sandbox Code Playgroud)%z | UTC offset in the form +HHMM or -HHMM (empty string if the object is naive). | (empty), +0000, -0400, +1030 %Z | Time zone name (empty string if the object is naive). | (empty), UTC, EST, CST
所以我尝试以下方法
datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%Z')
Run Code Online (Sandbox Code Playgroud)
我没有得到任何错误,但是我得到的对象不是tz意识到的
datetime.datetime(2017, 3, 30, 8, 25)
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我将我的字符串转换为"2017-03-30 08:25:00+0200"然后将其转换为对象
datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%z')
我确实得到了一个tz感知的日期时间:
datetime.datetime(2017, 3, 30, 8, 25, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))
Run Code Online (Sandbox Code Playgroud)
任何想法为什么它适用%z但不与%Z …
我有这样的时间字符串: 2013-08-22 16:56:19 Etc/GMT
我需要将它解析为datetime对象.我陷入了posix风格的时区,我无法让Python本地化.
这是一些尝试和他们的失败.我首先包括时区剥离版本,以显示解析是否正确.
datetime.strptime
>>> datetime.datetime.strptime("2013-08-22 16:56:19 UTC", "%Y-%m-%d %H:%M:%S %Z")
datetime.datetime(2013, 8, 22, 16, 56, 19)
>>> datetime.datetime.strptime("2013-08-22 16:56:19 Etc/GMT", "%Y-%m-%d %H:%M:%S %Z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 325, in _strptime
(data_string, format))
ValueError: time data '2013-08-22 16:56:19 Etc/GMT' does not match format '%Y-%m-%d %H:%M:%S %Z'
Run Code Online (Sandbox Code Playgroud)
time.strptime
>>> time.strptime("2013-08-22 16:56:19 UTC", "%Y-%m-%d %H:%M:%S %Z")
time.struct_time(tm_year=2013, tm_mon=8, tm_mday=22, tm_hour=16, tm_min=56, tm_sec=19, tm_wday=3, tm_yday=234, tm_isdst=0)
>>> time.strptime("2013-08-22 16:56:19 Etc/GMT", …Run Code Online (Sandbox Code Playgroud) 我有一个这样的日期时间Thu Jun 02 11:56:53 CDT 2011
我试图使用下面的代码将它转换为日期时间对象
from dateutil import parser
timestamp = parser.parse("Thu Jun 02 11:56:53 CDT 2011")
Run Code Online (Sandbox Code Playgroud)
但我收到这个警告
UnknownTimezoneWarning: tzname CDT identified but not understood.
Pass `tzinfos` argument in order to correctly return a timezone-aware datetime.
In a future version, this raise an exception.
category=UnknownTimezoneWarning)
Run Code Online (Sandbox Code Playgroud)
当我使用UTC代替时没有警告CDT。我可以tzinfos用来解决这个问题吗?
由于时区缩写,我很难将非UTC时间的字符串表示转换为UTC.
(更新:似乎时区缩写可能不是唯一的.如果是这样,也许我也应该考虑这一点.)
我一直在尝试使用datetutil和pytz寻找方法,但没有任何运气.
建议或解决方法将不胜感激.
string = "Jun 20, 4:00PM EDT"
Run Code Online (Sandbox Code Playgroud)
我想将其转换为UTC时间,在适当的时候考虑夏令时.
更新:找到一些可能有助于更有经验的用户回答Q的参考资料.
从本质上讲,我会想象的解决方案做相反的一部分这个.
最终更新(重要)
一些基于date命令的简单示例,使用TZOFFSET字典提供BRST时区偏移量.
解析("Thu Sep 25 10:36:28 BRST 2003",tzinfos = TZOFFSETS)datetime.datetime(2003,9,25,10,36,28,tzinfo = tzoffset('BRST', - -10800))
parse("2003 10:36:28 BRST 25 Sep Thu",tzinfos = TZOFFSETS)datetime.datetime(2003,9,25,10,36,28,tzinfo = tzoffset('BRST', - -10800))
我试图将字符串转换为日期时间对象.我从新闻Feed获得的字符串采用以下格式:"星期四,2014年10月16日01:16:17 EDT"
我尝试使用datetime.strptime()来转换它.即
datetime.strptime('Thu, 16 Oct 2014 01:16:17 EDT','%a, %d %b %Y %H:%M:%S %Z')
Run Code Online (Sandbox Code Playgroud)
并得到以下错误:
回溯(最近一次调用最后一次):
文件"",第1行,在datetime.strptime('星期四,2014年10月16日01:16:17 EDT','%a,%d%b%Y%H:%M: %S%Z')
文件"C:\ Anaconda\lib_strptime.py",第325行,在_strptime(data_string,format)中)
ValueError:时间数据'星期四,2014年10月16日01:16:17 EDT'格式不匹配'%a,%d%b%Y%H:%M:%S%Z'
但是,如果我尝试没有"EDT"的字符串,它就可以了.即
datetime.strptime('Thu, 16 Oct 2014 01:16:17','%a, %d %b %Y %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解析"EDT"部分?
我试图从以下日期创建一个日期时间对象:'Fri Mar 11 15:59:57 2016 2016'使用格式:'%a%b%d%H:%M:%S%Z%Y' .
这是代码.
from datetime import datetime
date = datetime.strptime('Fri Mar 11 15:59:57 EST 2016', '%a %b %d %H:%M:%S %Z %Y')
Run Code Online (Sandbox Code Playgroud)
但是,这会导致ValueError,如下所示.
ValueError: time data 'Fri Mar 11 15:59:57 EST 2016' does not match format '%a %b %d %H:%M:%S %Z %Y'
Run Code Online (Sandbox Code Playgroud)
也许我错过了我的格式字符串明显错误的东西,但我一遍又一遍地检查它.非常感谢任何帮助,谢谢.
编辑以反映评论/问题以获取更多信息:
我正在使用的Python版本是2.7.6.
在Ubuntu 14.04上使用'locale'命令我得到这个:
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud) 如何将表单的日期时间字符串转换为Feb 25 2010, 16:19:20 CETunix时代?
目前我最好的方法是用time.strptime()这个:
def to_unixepoch(s):
# ignore the time zone in strptime
a = s.split()
b = time.strptime(" ".join(a[:-1]) + " UTC", "%b %d %Y, %H:%M:%S %Z")
# this puts the time_tuple(UTC+TZ) to unixepoch(UTC+TZ+LOCALTIME)
c = int(time.mktime(b))
# UTC+TZ
c -= time.timezone
# UTC
c -= {"CET": 3600, "CEST": 2 * 3600}[a[-1]]
return c
Run Code Online (Sandbox Code Playgroud)
我从其他问题中看到可能会使用calendar.timegm(),以及pytz其中简化这一点,但这些不处理缩写的时区.
我想要一个需要最少多余库的解决方案,我希望尽可能多地保留标准库.
有没有办法,在linux中,有问题地获得给定时间字符串的UTC时间
Tue Dec 14 10:30:23 PST 2012
Tue Jan 4 11:30:23 EST 2013
Run Code Online (Sandbox Code Playgroud)
到UTC时间,无论(并且不更改)本地时区设置?
我需要获取 RSS 提要的已发布字段,并且我需要知道时区是什么。我以 UTC 格式存储日期,并且我想要另一个字段来存储时区,以便我以后可以操纵日期时间。
我目前的代码如下:
for entry in feed['entries']:
if hasattr(entry, 'published'):
if isinstance(entry.published_parsed, struct_time):
dt = datetime(*entry.published_parsed[:-3])
Run Code Online (Sandbox Code Playgroud)
dt 的最终值是 UTC 中的正确日期时间,但我还需要获取原始时区。任何人都可以帮忙吗?
编辑:
为了将来参考,即使它不是我最初问题的一部分,如果您需要操作非标准时区(如 est),您需要根据您的规范制作一个转换表。感谢这个答案:Parsing date/time string with timezone abbreviated name in Python?
例如:我有一个日期字符串
2018-02-17 16:15:36.519 PST
Run Code Online (Sandbox Code Playgroud)
我如何在 UTC 中转换为 isoformat,如下所示
2018-02-18T00:15:36.519Z
Run Code Online (Sandbox Code Playgroud)
我试过这个
from dateutil.parser import parse
d1='2018-02-17 16:15:36.519 PST'
print parse(d1)
it prints like this. How do i convert it to UTC with Z at the end.
2018-02-17 16:15:36.519000-08:00
Run Code Online (Sandbox Code Playgroud)
使用 python 2.7 进行编辑。
import dateutil
import pytz
from dateutil.parser import parse
d1='2018-02-17 16:15:36.519 PST'
d2=dateutil.parser.parse(d1)
d2.replace(tzinfo=pytz.utc) - d2.utcoffset()
d3=(d2.replace(tzinfo=pytz.utc) - d2.utcoffset()).isoformat()
print d3
Run Code Online (Sandbox Code Playgroud)
然后按照建议使用 Z 进行格式化
我如何使用 dateutil.tz.tz.tzoffset 类型的对象来本地化具有正确时区和 DST 信息的时区原始日期时间对象,以便它可以正确转换为 UTC?或者,如何将 dateutil.tz.tz.tzoffset 转换为 pytz.timezone?
我一直无法找到有关使用 dateutil.tz.tz.tzoffset 对象本地化日期时间对象的好信息。请参阅下面的一些我审查过的更好的文章。
背景资料:
我正在处理大量日期字符串,其中大多数没有时区信息。在某些情况下,时间是格林威治标准时间,在其他情况下是本地时间。我必须首先确定创建这些各种日志的设备的时区,然后解析各种日期字符串,如果是本地时间,则添加添加时区,最后将其转换为 UTC。
我几乎让这一切都在工作,除了确定时区的唯一可靠方法是从文本文件中获取日期格式为 EDT、IST 等,因此我使用了以下链接中最高投票的帖子来完成这使用 dateutil 的 parser.parse() 函数并将其发送给它的 tzinfos 参数的字典。(在 Python 中使用时区缩写名称解析日期/时间字符串?)
但是,这给我留下了一个 DateTime,它有一个 tzinfo type=dateutil.tz.tz.tzoffset。我没问题,除非我需要使用这个 tzinfo 来本地化不包含时区信息的字符串,并且 dateutil.tz.tz.tzoffset 类型没有像 pytz.timezone 那样的本地化选项,这是关键我的问题。
我让这太难了吗?我是否只是用我保存的 dateutil.tz.tz.tzoffset 对象替换了时区天真日期时间中的 tzinfo ?
代码:
下面读取日期字符串并将其保存为日期时间对象,将时区保存在 var 中以备后用,然后将日期字符串转换为 UTC:
from dateutil.parser import parse as parsedate
import pytz
from pytz import timezone
from datetime import datetime
timestr = 'Sat, 5/01/2019 8:00PM EDT' #only reliable source of timezone info
dtfromstrEDT = parsedate(timestr, tzinfos=tzd) …Run Code Online (Sandbox Code Playgroud)