Python中的日期字符串(1983年2月26日00Z至00-26-02-83)

时间:2018-12-06 17:30:04

标签: python string datetime text-files extract

我有一个文本文件,需要对包含日期的行进行细化(例如2月26日00Z),希望从看起来像这样的字符串中提取日期:

<H2>04018 BIKF Keflavikurflugvollur Observations at 00Z 26 Feb 1983</H2>
<H2>04018 BIKF Keflavikurflugvollur Observations at 12Z 26 Feb 1983</H2>
<H2>04018 BIKF Keflavikurflugvollur Observations at 00Z 28 Feb 1983</H2>
<H2>04018 BIKF Keflavikurflugvollur Observations at 12Z 28 Feb 1983</H2>

,依此类推。

因此,我想查找包含日期的行,然后提取1983年2月26日的00Z并将其转换为00-26-02-1983。如何在Python中做到这一点? 谢谢

3 个答案:

答案 0 :(得分:1)

一起使用regexdatetime

import re
from datetime import datetime

line = '<H2>04018 BIKF Keflavikurflugvollur Observations at 00Z 26 Feb 1983</H2>'
matches = re.findall(r"(\d{2}Z \d{2} [a-zA-Z]{3} \d{4})", line)
for match in matches:
    line = line.replace(match, datetime.strptime(match, '%HZ %d %b %Y').strftime('%H-%d-%m-%Y'))
print(line)

另一种选择是如下直接使用re.sub

import re
from datetime import datetime

def my_replace(match):
    match = match.group()
    return datetime.strptime(match, '%HZ %d %b %Y').strftime('%H-%d-%m-%Y')

line = '<H2>04018 BIKF Keflavikurflugvollur Observations at 00Z 26 Feb 1983</H2>'
line = re.sub(r"(\d{2}Z \d{2} [a-zA-Z]{3} \d{4})", my_replace, line)
print(line)

输出为

    <H2>04018 BIKF Keflavikurflugvollur Observations at 00-26-02-1983</H2>

答案 1 :(得分:0)

可能会有一条更简单的路线,但这行得通(从您的其中一行开始):

from time import strptime
text = "<H2>04018 BIKF Keflavikurflugvollur Observations at 00Z 26 Feb 1983</H2>"
text = text.replace("Z","").replace("</H2>","").split(" ")
text[-2]=str(strptime(text[-2],"%b").tm_mon)
text = "-".join(text[-4:])

给予:

print(text)
> '00-26-2-1983'

说明:

text.replace("Z","")删除文本中的“ Z”(用空字符串“”替换“ Z”)。 .replace("</H2>","")进一步删除“”。 .split(" ")将您的字符串更改为字符串列表。然后,第三行返回:

['<H2>04018', 'BIKF', 'Keflavikurflugvollur', 'Observations', 'at', '00', '26', 'Feb', '1983']

在这里,我们只需要将“ Feb”(索引-2出现在列表的倒数第二个)更改为一个用strptime(text[-2],"%b").tm_mon完成的数字,然后将其转换为{ {1}}。然后,第四行返回:

str()

最后,感兴趣的字符串(从索引['<H2>04018', 'BIKF', 'Keflavikurflugvollur', 'Observations', 'at', '00', '26', '2', '1983'] 到末尾)可以按照您的要求与“-”连接,就像最后一行-4一样。


您已经尝试过的"-".join(text[-4:])也存在一些问题。首先,strptime不知道对“ Z”应该做什么:您必须先丢弃它,然后再将其提供给函数。然后,您没有将正确的参数传递给函数。根据{{​​3}},这是您告诉strptime的内容:

  • datetime_object = datetime.strptime('00Z 28 Feb 1983', '%h %d %M %Y'):与%h =缩写月份名称
  • %b:每月的某天(01到31)
  • %d:分钟
  • %M:包括世纪在内的年份

但是实际上,这些并不是您要赋予的功能:实际上是'00 28 Feb 1983':

  • %Y:小时,使用24小时制(00到23)
  • %H:每月的某天(01到31)(此正确)
  • %d:月份的缩写
  • %b:包括世纪在内的年份(这一年是正确的)

解决此问题,您会得到:

%Y

您可以从中获得:

datetime_object = datetime.strptime('00 28 Feb 1983', '%H %d %b %Y')
>  time.struct_time(tm_year=1983, tm_mon=2, tm_mday=28, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=59, tm_isdst=-1)

答案 2 :(得分:0)

import datetime

string = '<H2>04018 BIKF Keflavikurflugvollur Observations at 00Z 26 Feb 1983</H2>'
string = string.replace('<H2>', '')
string = string.replace('</H2>', '')
splitted_string = string.split('at ')
#  ex:['04018 BIKF Keflavikurflugvollur Observations ', '00Z 26 Feb 1983']

x = datetime.datetime.strptime(splitted_string[1], "%fZ %d %b %Y").strftime("%f-%d-%m-%Y")
print(x)

希望此代码对您有所帮助。