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

时间:2015-07-10 16:11:22

标签: python csv datetime

我有一个带有10,000个日期字符串的csv文件,看起来像2000 / 2000_03.mdf,我只需要每个字符串的年份和月份。我尝试过使用:

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

但这会返回错误。我猜它与mdf有关,最后一年和重复的一年,但我不知道如何消除字符串的那些部分只能得到我想要的时间。是否有更简单的方法来提取月份和年份?

5 个答案:

答案 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)