在Python中解析带有时区缩写名称的日期/时间字符串?
在Python中解析带有时区缩写名称的日期/时间字符串?
我正在尝试在Python中解析时间戳字符串,例如\"Sat, 11/01/09 8:00PM EST\"
,但是我很难找到一个能处理缩写时区的解决方案。\n我正在使用dateutil
的parse()
函数,但它无法解析时区。有没有简单的方法可以做到这一点?
问题的出现原因是用户想要使用pytz模块解析带有时区缩写名称的日期/时间字符串。然而,用户发现在解析"Sat, 11/01/09 8:00PM EST"时遇到了困难,并询问如何使用pytz解决这个问题。
解决方法是使用pytz模块。pytz模块将Olson时区数据库引入Python中,可以在Python 2.3或更高版本中进行准确且跨平台的时区计算。它还解决了夏令时结束时模糊时间的问题。用户可以通过阅读Python库参考中的相关内容(datetime.tzinfo)了解更多信息。该模块支持几乎所有Olson时区。
然而,用户发现问题无法解决,因为时区缩写名称不是一对一的。好消息是,pytz已经提供了映射(一对多)的功能,程序员可以选择所需的映射。在这种情况下,'EST'是一个模糊的时区缩写名称,但用户可以使用pytz列举所有可能的解释来解决这个问题。
以下是解决问题的代码示例:
import pytz from datetime import datetime date_string = "Sat, 11/01/09 8:00PM EST" possible_timezones = pytz.common_timezones for timezone in possible_timezones: try: aware_datetime = datetime.strptime(date_string, "%a, %m/%d/%y %I:%M%p").replace(tzinfo=pytz.timezone(timezone)) print(f"Successfully parsed with timezone: {timezone}") print(aware_datetime) break except ValueError: continue
上述代码将尝试使用pytz模块中的不同时区进行解析,直到找到一个成功解析的时间。它通过捕获ValueError异常来处理解析失败的情况,并继续尝试其他时区。最终,它会打印成功解析的时区和对应的时间。
问题的原因是时区的缩写并不唯一,解决方法是如果你使用的是已知的输入集,可能需要手动处理。
如果限制在美国的时区,问题是否会变得更容易?在这种情况下,是否有一个“标准”的缩写集合?
不要忘记“美国的时区”包括AKST,AKDT,HAST和HADT。如果只是指的是48个州,那么只有8个三个字母的时区需要处理(4个时区,标准时间和夏令时)。
显然,为了保险起见,某些地方也使用HST和HDT作为HAST和HADT的等效缩写。
到目前为止,最简单的方法(虽然通常不是最实际的)是调整提供数据的程序,使其以UTC发送所有数据,如果不行的话,使用相对于UTC的偏移量,或者在zoneinfo数据库中使用完整有效的时区。
当然,这并不总是由开发者控制。
问题:如何在Python中解析带有时区缩写的日期/时间字符串?
原因:在Python中解析日期/时间字符串时,如果字符串中包含时区的缩写名称,会导致解析失败。因此,需要找到一种方法来正确解析带有时区缩写的日期/时间字符串。
解决方法:可以使用dateutil库的parser模块中的parse()函数来解析日期/时间字符串。并且可以使用tzinfos参数来指定时区缩写和对应的GMT偏移量,以解决解析失败的问题。具体步骤如下:
1. 导入dateutil.parser模块:import dateutil.parser as dp
2. 定义日期/时间字符串:s = 'Sat, 11/01/09 8:00PM'
3. 遍历时区缩写列表,例如('PST','PDT','MST','MDT','CST','CDT','EST','EDT'):
a. 将时区缩写添加到日期/时间字符串中:dt = s+' '+tz_code
b. 解析日期/时间字符串并打印结果:print dt, '=', dp.parse(dt, tzinfos=tzd)
通过以上步骤,可以成功解析带有时区缩写的日期/时间字符串,并得到正确的结果。
关于tzinfos参数的内容,可以通过以下代码来定义:
tz_str = '''-12 Y
-11 X NUT SST
-10 W CKT HAST HST TAHT TKT
-9 V AKST GAMT GIT HADT HNY
-8 U AKDT CIST HAY HNP PST PT
-7 T HAP HNR MST PDT
-6 S CST EAST GALT HAR HNC MDT
-5 R CDT COT EASST ECT EST ET HAC HNE PET
-4 Q AST BOT CLT COST EDT FKT GYT HAE HNA PYT
-3 P ADT ART BRT CLST FKST GFT HAA PMST PYST SRT UYT WGT
-2 O BRST FNT PMDT UYST WGST
-1 N AZOT CVT EGT
0 Z EGST GMT UTC WET WT
1 A CET DFT WAT WEDT WEST
2 B CAT CEDT CEST EET SAST WAST
3 C EAT EEDT EEST IDT MSK
4 D AMT AZT GET GST KUYT MSD MUT RET SAMT SCT
5 E AMST AQTT AZST HMT MAWT MVT PKT TFT TJT TMT UZT YEKT
6 F ALMT BIOT BTT IOT KGT NOVT OMST YEKST
7 G CXT DAVT HOVT ICT KRAT NOVST OMSST THA WIB
8 H ACT AWST BDT BNT CAST HKT IRKT KRAST MYT PHT SGT ULAT WITA WST
9 I AWDT IRKST JST KST PWT TLT WDT WIT YAKT
10 K AEST ChST PGT VLAT YAKST YAPT
11 L AEDT LHDT MAGT NCT PONT SBT VLAST VUT
12 M ANAST ANAT FJT GILT MAGST MHT NZST PETST PETT TVT WFT
13 FJST NZDT
11.5 NFT
10.5 ACDT LHST
9.5 ACST
6.5 CCT MMT
5.75 NPT
5.5 SLT
4.5 AFT IRDT
3.5 IRST
-2.5 HAT NDT
-3.5 HNT NST NT
-4.5 HLV VET
-9.5 MART MIT'''
tzd = {}
for tz_descr in map(str.split, tz_str.split('\n')):
tz_offset = int(float(tz_descr[0]) * 3600)
for tz_code in tz_descr[1:]:
tzd[tz_code] = tz_offset
以上代码将时区缩写和对应的GMT偏移量存储在字典tzd中。
需要注意的是,时区的命名并不是完全一致的,有些时区的缩写可能有多个含义。因此,在使用tzinfos参数解析日期/时间字符串时,可能需要根据具体情况进行调整和选择。
通过使用dateutil库的parser模块的parse()函数,并结合tzinfos参数,可以成功解析带有时区缩写的日期/时间字符串,得到正确的结果。