我有一个文本文件,需要对包含日期的行进行细化(例如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中做到这一点? 谢谢
答案 0 :(得分:1)
一起使用regex
和datetime
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)
希望此代码对您有所帮助。