Python中迄今为止的字符串(00Z 1983年2月26日至00260283)

2024-04-29 18:51:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件,需要对包含日期的行(例如00Z 26 Feb)进行微调,以便从如下字符串中提取日期:

<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>

等等。你知道吗

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


Tags: 字符串h2febat文本文件微调observationsbikf
3条回答

同时使用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>
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)

希望这个代码能帮助你。你知道吗

可能有一条更简单的路线,但这是可行的(从您的一条线路):

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完成的数字,并用str()将其转换回一个字符串。第四行返回:

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

最后,感兴趣的字符串(从索引-4到结尾)可以根据您的请求用“-”连接起来,就像在最后一行"-".join(text[-4:])中所做的那样。你知道吗


另外,您已经尝试过的方法也存在一些问题datetime_object = datetime.strptime('00Z 28 Feb 1983', '%h %d %M %Y')。首先,strtime不知道它应该对“Z”做什么:在把它交给函数之前必须丢弃它。然后,您没有将正确的参数传递给函数。根据the tutorial,以下是您告诉strtime的内容:

  • %h:与%b=缩写月名相同
  • %d:每月的第几天(01到31)
  • %M:分钟
  • %Y:包括世纪在内的年份

但这些并不是你实际赋予函数的内容:“00 28 Feb 1983”实际上是:

  • %H:小时,使用24小时制(00到23)
  • %d:月日(01到31)(这个是正确的)
  • %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)

您可以从中获得:

text = str(datetime_object.tm_hour)+"-"+str(datetime_object.tm_mday)+"-"+str(datetime_object.tm_mon)+"-"+str(datetime_object.tm_year)
> '0-28-2-1983'

相关问题 更多 >