【问题标题】:Converting date string (YYYY/YYYY_mm.mdf) into useable date Python将日期字符串(YYYY/YYYY_mm.mdf)转换为可用日期 Python
【发布时间】:2015-09-29 11:37:52
【问题描述】:

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

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

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

【问题讨论】:

  • 所以将.mdf 放入您的格式字符串中...这就是为什么% 在那里-Y 作为格式字符和Y 作为字符串中的常规字符之间的区别。

标签: python csv datetime


【解决方案1】:

如果您绝对确定这一年将始终正确重复,我会....跳过这一年。

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?

【讨论】:

    【解决方案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')
    

    【讨论】:

      【解决方案3】:

      一个简单的正则表达式适用于这种情况,它应该比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
      

      【讨论】:

        【解决方案4】:

        你可以对字符串进行切片:

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

        这会产生以下结果:

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

        【讨论】:

          【解决方案5】:

          解决字符串中多个 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)
          
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-04-07
            • 2018-05-19
            • 2011-11-01
            • 2014-09-27
            • 1970-01-01
            • 2021-03-19
            • 1970-01-01
            • 2011-11-28
            相关资源
            最近更新 更多