2015-07-10 148 views
0

我有一个带有10,000个日期字符串的csv文件,它看起来像2000/2000_03.mdf,我只需要每个字符串的年份和月份。我试过使用:将日期字符串(YYYY/YYYY_mm.mdf)转换为可用日期Python

datetime.strptime('2000/2000_03.mdf', '%Y/%Y_%m') 

但这会返回一个错误。我猜这与mdf到底是什么有关,而且是重复的一年,但我不确定如何消除字符串的这些部分以获得我想要的时间。有没有简单的方法来提取月份和年份?

+2

所以就把'.mdf'到您的格式字符串...这就是为什么有''%在那里 - 为格式字符Y'之间的区别'和'Y'作为字符串中的常规字符。 –

回答

1

您可以直接切片字符串:

datetime.strptime('2000/2000_03.mdf'[5:-4], '%Y_%m') 

我们得到以下:

datetime.datetime(2000, 3, 1, 0, 0) 
5

如果您绝对相信,今年将永远是正确的重复,我只。 ...跳过一年。

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

这有两个问题。第一个是末尾的.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') 
1

一个简单的正则表达式工作在这种情况下,它应该比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