我有一个带有10,000个日期字符串的csv文件,它看起来像2000/2000_03.mdf,我只需要每个字符串的年份和月份。我试过使用:将日期字符串(YYYY/YYYY_mm.mdf)转换为可用日期Python
datetime.strptime('2000/2000_03.mdf', '%Y/%Y_%m')
但这会返回一个错误。我猜这与mdf到底是什么有关,而且是重复的一年,但我不确定如何消除字符串的这些部分以获得我想要的时间。有没有简单的方法来提取月份和年份?
我有一个带有10,000个日期字符串的csv文件,它看起来像2000/2000_03.mdf,我只需要每个字符串的年份和月份。我试过使用:将日期字符串(YYYY/YYYY_mm.mdf)转换为可用日期Python
datetime.strptime('2000/2000_03.mdf', '%Y/%Y_%m')
但这会返回一个错误。我猜这与mdf到底是什么有关,而且是重复的一年,但我不确定如何消除字符串的这些部分以获得我想要的时间。有没有简单的方法来提取月份和年份?
您可以直接切片字符串:
datetime.strptime('2000/2000_03.mdf'[5:-4], '%Y_%m')
我们得到以下:
datetime.datetime(2000, 3, 1, 0, 0)
如果您绝对相信,今年将永远是正确的重复,我只。 ...跳过一年。
s = '2000/2000_03.mdf'.split('/')
d = datetime.strptime(s[1], '%Y_%m.mdf')
if int(s[0]) != d.year:
#uh, that file is confused. Do something?
这有两个问题。第一个是末尾的.mdf
,正如@ marc-b指出的那样,可以通过将其添加到您的格式字符串来解决。
但是,如果你只是这样做,你会发现,你仍然可以得到一个ValueError
:
error: redefinition of group name 'Y' as group 2; was group 1
你不能两次strptime
匹配同一组。如果你的数据在你提出的格式一致,那么你可以使用string.split
提取第二部分,并从阅读:
basename = '2000/2000_03.mdf'.split('/')[1]
datetime.strptime(basename, '%Y_%m.mdf')
一个简单的正则表达式工作在这种情况下,它应该比strptime()
更轻松更高效比.split()
为基础的解决方案为:
import re
from datetime import date
def parse_date(path):
"""Return date stored in the *path* or None on any error."""
try:
year1, year2, month = map(int, re.findall(r'\d+', path))
if year1 == year2:
return date(year2, month, 1)
except ValueError:
pass
所以就把'.mdf'到您的格式字符串...这就是为什么有''%在那里 - 为格式字符Y'之间的区别'和'Y'作为字符串中的常规字符。 –