将日期字符串(YYYY/YYYY_mm.mdf)转换为可用的日期Python



我有一个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)

相关内容

  • 没有找到相关文章

最新更新