【问题标题】:Parsing date string in Python在 Python 中解析日期字符串
【发布时间】:2012-04-08 10:55:41
【问题描述】:

如何重写以下子句:

if u'января' in date_category['title']:
    month = 1
elif u'февраля' in date_category['title']:
    month = 2
elif u'марта' in date_category['title']:
    month = 3
elif u'апреля' in date_category['title']:
    month = 4
elif u'мая' in date_category['title']:
    month = 5
elif u'июня' in date_category['title']:
    month = 6
elif u'июля' in date_category['title']:
    month = 7
elif u'августа' in date_category['title']:
    month = 8
elif u'сентября' in date_category['title']:
    month = 9
elif u'октября' in date_category['title']:
    month = 10
elif u'ноября' in date_category['title']:
    month = 11
elif u'декабря' in date_category['title']:
    month = 12

只是看起来很丑。

【问题讨论】:

  • @Marcin 当然。它是一个解析器,我有一个带有俄罗斯日期的字符串。我strptime() 不适用于这些。 date-util 包也不起作用。我正在用简单的正则表达式解析一天,现在我需要以某种方式解析月份。下一个字符串只需要解析月份和日期并创建日期时间对象。
  • 你怎么检查月份是否在 date_category['title'] 中,你可以只检查月份列表中的月份索引吗?
  • @Marcin 一月的俄语 %B 是 'январь''January, 23''23 января',所以这行不通。
  • @jamylak date_category['title'] 不仅包含月份,还包含其他一些信息。
  • @Shark 我很确定您不了解 python 日期解析的工作原理。 %B 指月份,如果您正确设置语言环境,它将处理俄罗斯日期。

标签: python string


【解决方案1】:

要解决这个问题,请使用 python datetime 模块解析您的日期信息。它支持语言环境,并将解决这个问题。如果所有格形式确实是问题,那么只需将这些形式映射到与格,然后映射回输出。

回答您的实际问题 -

假设您正在将数据与整数配对。如果你能把你的数据转换成(month, integer)的格式,你就可以用数据驱动你的代码。

for (n, month) in enumerate(u'января, feb, mar, apri, may, jun, jul, aug, sep, oct, nov, декабря'.split(', '), 1):# the parameter 1 specifies to start counting from 1. h/t @san4ez
    if month in date_category['title']: return n

【讨论】:

  • 考虑添加某种类型检查,例如return d[title] if d in title else None
  • enumerate(iterable, 1)从1开始枚举。所以返回值时不需要增加n
  • @AdamMatan (a) 这不在 OP 的代码中 (b) 这是一个循环。它仅在找到某些东西时返回。如果你从函数的末尾掉下来,无论如何你都会得到None
  • @Marcin 也许,但 IMO 显式优于隐式。口味问题。
  • 我的意思是单独创建字典并查询它。这是一种不同的方法。 @Marcin
【解决方案2】:

获取俄罗斯国际化的系统支持:OS locale support for use in Python

使用locale 模块设置语言环境:How to get unicode month name in Python?

使用strptimeHandling international dates in python

演示:Locale troubles


或者,只是这样做:

months = ['Jan', 'Feb', 'Mar', ...]
monthToNumber = dict((name,i+1) for i,name in enumerate(months))

monthToNumber[date_category['title']]

【讨论】:

  • 但他不能! Python 不知道俄罗斯!
【解决方案3】:
months = (u'января', u'февраля', u'марта', u'апреля', u'мая', u'июня', u'июля', u'августа', u'сентября', u'октября', u'ноября', u'декабря')
month = next(i for i,name in enumerate(months,1) if name in date_category['title'])

【讨论】:

    【解决方案4】:

    您还可以使用列表中的索引函数来获取月份到月份数的映射

    months = (u'января', u'февраля', u'марта', u'апреля', u'мая', u'июня', u'июля', u'августа', u'сентября', u'октября', u'ноября', u'декабря')
    month = months.index(date_category['title'])+1
    

    【讨论】:

    • 问题是date_category['title']还包含其他信息,所以不能用作索引。
    • @jamylak:我从来没有想到过。在这种情况下,如果 OP 提到格式,它很可能会简化为月份名称。
    • 任何不赞成投票的人,请发表评论。
    • @Abhijit:您的回答中有几个错误。即month = moths 和你索引index 的事实。应该是months.index(round brackets)
    • @jamylak:我没有意识到date_category['title'] 包含的不仅仅是月份的名称。我想我也将不得不修改我的答案。
    【解决方案5】:

    创建月份的字典,并带有相应的索引:

    months = [u'января', u'февраля', u'марта', u'апреля', u'мая', u'июня', u'июля', u'августа', u'сентября', u'октября', u'ноября', u'декабря']
    

    那么你可以简单地做:

    month = max(enumerate((date_category['title'].find(month) for month in months), start = 1), key = lambda x: x[1])[0]
    

    【讨论】:

    • 我认为您还没有阅读其他答案和 cmets。我不能使用 date_category['title'] 作为索引,因为月份名称只是其中的一小部分。
    【解决方案6】:

    只需创建一个哈希数组,将您的字符串映射到相应的月份编号,然后您可以简单地遍历它,检查键在哪里in date_category['title'],并且在所有情况下,将月份设置为相应的值。祝你好运。

    【讨论】:

    • 为什么需要哈希表?
    【解决方案7】:

    这里有一些更反常的东西,因为我喜欢证明说“应该只有一种方法”是徒劳的:

    pattern = re.compile(u'(января)|(февраля)|(марта)|(апреля)|(мая)|(июня)|(июля)|(августа)|(сентября)|(октября)|(ноября)|(декабря)')
    
    month = map(bool, x.search(date_category['title']).groups()).index(True) + 1
    

    【讨论】:

      猜你喜欢
      • 2012-06-14
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 2014-06-10
      • 2010-12-01
      • 2012-05-24
      • 2011-07-21
      相关资源
      最近更新 更多