【问题标题】:How can I change textual dates to numbered ones in Python?如何在 Python 中将文本日期更改为带编号的日期?
【发布时间】:2012-05-14 12:45:09
【问题描述】:

我有一个 Python 3.2.2 程序,其中有一个类似这样的列表:

['January 26, 1991', 'February 29, 2012', 'December 10, 2094']

如果不使用一百万个“if”语句,我如何获取列表并更改它或创建一个如下所示的新列表:

['01261991', '02292012', '12102094']

基本上将完整的日期格式转换为mmddyyyy格式?

我在这里查看了各种其他问题,但似乎找不到这样的问题。如果有人能指出我正确的方向,那就太好了!

【问题讨论】:

  • 你可以使用标准库模块吗?
  • 另外,您的输出不一致。你要不要逗号?
  • 而不是使用 if 语句使用字典,{'january':01,'february':02,'march':03.....}

标签: python list date replace


【解决方案1】:

Python 至少有两个处理时间的模块。 (第一个是time,第二个是datetime)。具体看strftimestrptime,它们是从字符串创建“时间对象”然后从“时间对象”创建字符串的方法。

还要注意,在 python 中,列表通常表示为 '[ item1, item2, ... ]'(方括号,而不是大括号——大括号用于字典 ...)。

最后,您最终想要的日期字符串不符合与其他 2 个相同的规则...

【讨论】:

  • 我认为作业只是要求在给出字符串时对其进行操作。我的意思是 ['January 26, 1991', 'February 29, 2012', 'December 10, 2094'] 被硬编码到程序中。我只需要将它处理成 mmddyyyy 格式。我该怎么做呢?抱歉之前的错别字。
【解决方案2】:

您确实想要strptimestrftime:我认为p 用于“进程”,f 用于格式。

它们都采用格式字符串和参数来根据该字符串进行处理。 str*time 函数的丰富历史可以追溯到 C 语言,python 的功能与原始函数非常直接相关,只是它更好。

我说它更好,因为如果您查看strptime and strftime behavior,您会发现格式字符串有自己的迷你语言,而且它几乎不直观,足以让您犯下难以发现的严重错误. (例如,我仍然需要查看分钟是大写还是小写 m。)

另外,如果您使用的是 Linux(可能还有 OSX?)man strptime 我发现比 python 文档更有帮助。 strftime 也是如此。

【讨论】:

    【解决方案3】:

    如果你不想使用任何modules,你可以试试这个:

    dates=['January 26, 1991', 'February 29, 2012', 'December 10, 2094']
    def converter(x):
       x=x.split()
       dic={'January':'01','February':'02','March':'03','April':'04','May':'05','June':'06',
             'July':'07','August':'08','September':'09','October':'10','November':'11','December':'12'
            }
       month,day,year=dic[x[0]],x[1][:-1],x[2]
       if len(day)==1:
         day='0'+day
    
       return month+day+year
    
    new_lis=[]
    
    for x in dates:
       new_lis.append(converter(x))
    
    print(new_lis)
    
    ['01261991', '02292012', '12102094']
    

    【讨论】:

    • 对家庭作业问题给出完整的完整代码答案并不是一种很好的形式。此外,您的代码将在该月中非两位数的任何一天失败(它会正确去除逗号,但会给出无效的最终字符串)。
    • 感谢您的帮助。 “.split()”函数真正帮助了我。
    • @HughBothwell 是的!我错过了当月中的日期是个位数的情况,解决方案已修复。对于作业的事情,我没有看到作业标签,这就是为什么写了整个解决方案。
    • @Ivan 正如hughbothwell 建议的那样,在converter 函数if len(day)==1:day='0'+day 的return 语句之前的解决方案中有一个编辑
    【解决方案4】:

    首先,将字符串分成三块:

    'January 26, 1991'.split()    # results in ['January', '26,', '1991']
    

    二、用字典把月份名变成两位数:

    months = {'January':'01', 'February':'02'}
    months['January']     # results in '01'
    

    第三,去掉一天中的逗号,确保它是两位数。

    第四,重新组合月+日+年得到你的最终结果。

    第五,将其包装成一个函数并将该函数应用于列表中的每个元素。

    【讨论】:

      【解决方案5】:

      对于时间操作,您通常应该查看标准库中的 timedatetime 模块。

      >>> import time
      >>> raw_string_list = ['January 26, 1991', 'February 29, 2012', 'December 10, 2094']
      >>> struct_time_list = [time.strptime(raw_string, '%B %d, %Y') for raw_string in raw_string_list]
      >>> final_list = [time.strftime('%m%d%Y', struct_time) for struct_time in struct_time_list]
      >>> final_list
      ['01261991', '02292012', '12102094']
      

      对于这种情况,我们使用 time 模块的 2 个函数:strptime 将字符串转换回 time.struct_time 和 strftime 将其转换回新字符串。

      【讨论】:

        【解决方案6】:

        以下 Python 代码将完成您的任务:

        #! /usr/bin/env python
        from time import strptime, strftime
        input = ['January 26, 1991', 'February 29, 2012', 'December 10, 2094']
        date_list = []
        output = []
        
        for i in input:
            date_list.append(strptime(i, '%B %d, %Y'))
        
        for dd in date_list:
            output.append(strftime('%m%d%Y', dd))
        

        【讨论】:

          【解决方案7】:

          我会使用内置的日期时间模块,特别是strptime and strftime。利用map 将转换函数应用于列表的每个元素,您可以这样做:

          #!/usr/bin/env python
          
          from datetime import datetime
          
          dateList = ['January 26, 1991', 'February 29, 2012', 'December 10, 2094']
          
          def convertDate(dateString):
              dt = datetime.strptime(dateString,"%B %d, %Y")
              return dt.strftime("%m%d%Y")
          
          print map(convertDate,dateList)
          

          【讨论】:

            猜你喜欢
            • 2013-10-24
            • 2022-12-19
            • 2020-10-22
            • 1970-01-01
            • 2015-12-07
            • 1970-01-01
            • 2016-10-17
            • 1970-01-01
            • 2013-10-24
            相关资源
            最近更新 更多