【问题标题】:Extract date from a string with a lot of numbers从包含大量数字的字符串中提取日期
【发布时间】:2021-07-28 21:12:12
【问题描述】:

似乎有很多方法可以从字符串中提取各种格式的日期时间。但是当字符串包含许多数字和符号时似乎存在问题。

这是一个例子:

t = 'Annual Transmission Revenue Requirements and Rates Transmission Owner (Transmission Zone) Annual Transmission Revenue Requirement Network Integration Transmission Service Rate    ($/MW-Year) AE (AECO) $136,632,319 $53,775 AEP (AEP)   $1,295,660,732   $59,818.14  AP (APS) $128,000,000 $17,895 ATSI (ATSI) $659,094,666 $54,689.39 BC (BGE) $230,595,535 $35,762 ComEd, Rochelle (CE)  $702,431,433  $34,515.60 Dayton (DAY) $40,100,000 $13,295.76 Duke (DEOK) $121,250,903 $24,077 Duquesne (DLCO) $139,341,808 $51,954.44 Dominion (DOM) $1,031,382,000 $52,457.21 DPL, ODEC (DPL) $163,224,128 $42,812 East Kentucky Power Cooperative (EKPC) $83,267,903 $24,441 MAIT (METED, PENELEC) $150,858,703 $26,069.39 JCPL $135,000,000 $23,597.27  PE (PECO)  $155,439,100 $19,093 PPL, AECoop, UGI (PPL)  $435,349,329  $58,865 PEPCO, SMECO (PEPCO)   $190,876,083  $31,304.21 PS (PSEG) $1,248,819,352 $130,535.22 Rockland (RECO)  $17,724,263 $44,799 TrAILCo  $226,652,117.80  n/a  Effective June 1, 2018 '

import datefinder
m = datefinder.find_dates(t)
for match in m:
    print(match)

有没有办法顺利提取日期?如果没有更好的方法,我可以使用 re 获取特定格式。从datefinder的github看,好像一年前就废弃了。

【问题讨论】:

  • 日期是否总是在字符串的末尾?
  • 理想情况下,它可以是任何可以理解和明确的格式。
  • 也不一定在最后。

标签: python string datetime python-datetime datefinder


【解决方案1】:

虽然我不确切知道您的日期是如何格式化的,但这里有一个正则表达式解决方案,可以处理以“/”分隔的日期。应使用月份和日期表示为单个数字或包含前导零的日期。

如果您的日期由连字符分隔,请将正则表达式的第 9 个和第 18 个字符替换为连字符而不是 /。 (如果使用第二个打印语句,则替换第 12 和第 31 个字符)

编辑:添加了带有更好正则表达式的第二个打印语句。这可能是更好的方法。

import re
mystring = r'joasidj9238nlsd93901/01/2021oijweo8939n'
print(re.findall('\d{1,2}\/\d{1,2}\/\d{2,4}', mystring)) # This would probably work in most cases
print(re.findall('[0-1]{0,2}\/[0-3]{0,1}\d{0,1}\/\d{2,4}', mystring)) # This one is probably a better solution. (More protection against weirdness.)

编辑 #2:这是一种方法,可以拼出月份名称(完整或 3 个字符的缩写),然后是天,然后是逗号,然后是 2 或 4 位数的年份。

import re
mystring = r'Jan 1, 2020'
print(re.findall(r'(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}\,\s+\d{2,4}',mystring))

   

【讨论】:

  • 谢谢。 June 1, 2018 怎么样?
  • 所有日期的格式是否都是这样,月份名称是完整拼写,然后是日期,然后是 4 位数的年份?
  • 对上面的答案进行了编辑,以说明我认为您想要什么。 :)
猜你喜欢
  • 1970-01-01
  • 2011-02-17
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2016-12-17
相关资源
最近更新 更多