我有一个带有10,000个日期字符串的csv文件,看起来像2000 / 2000_03.mdf,我只需要每个字符串的年份和月份。我尝试过使用:
datetime.strptime('2000/2000_03.mdf', '%Y/%Y_%m')
但这会返回错误。我猜它与mdf有关,最后一年和重复的一年,但我不知道如何消除字符串的那些部分只能得到我想要的时间。是否有更简单的方法来提取月份和年份?
答案 0 :(得分:6)
如果你完全确定这一年将永远重复,我只是......跳过这一年。
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?
答案 1 :(得分:2)
这有两个问题。第一个是最后的.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')
答案 2 :(得分:2)
一个简单的正则表达式适用于这种情况,它应该比purchase_id
更有效,并且比基于strptime()
的解决方案更容易阅读:
.split()
答案 3 :(得分:1)
你可以切片:
datetime.strptime('2000/2000_03.mdf'[5:-4], '%Y_%m')
这产生以下结果:
datetime.datetime(2000, 3, 1, 0, 0)
答案 4 :(得分: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)