我有一个csv文件,其中有10,000个日期字符串,看起来像2000/2000_03。mdf和我只需要每个字符串的年和月。我试过使用:
datetime.strptime('2000/2000_03.mdf', '%Y/%Y_%m')
但是返回一个错误。我猜它与末尾的mdf和重复的年份有关,但我不确定如何消除字符串的这些部分以获得我想要的时间。有没有更简单的方法来提取月份和年份?
如果你绝对确定年份总是会正确地重复,我就....跳过年份
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
你可以直接分割字符串:
datetime.strptime('2000/2000_03.mdf'[5:-4], '%Y_%m')
结果如下:
datetime.datetime(2000, 3, 1, 0, 0)
解决字符串中多个strftime指令问题的一般方法是使用jfs回答中概述的正则表达式。
如果你像我一样在看正则表达式时皱着脸,你可以使用parse模块做同样的事情:
from parse import parse
from datetime import datetime
parsed_vals = parse('{dt_Y:4d}/{dt_Y:4d}_{dt_m:2d}.mdf', '2000/2000_03.mdf')
# <Result () {'dt_m': 3, 'dt_Y': 2000}>
datetime(parsed_vals['dt_Y'], parsed_vals['dt_m'], 1)
# datetime.datetime(2000, 3, 1, 0, 0)