【问题标题】:How to sort date in python?如何在python中对日期进行排序?
【发布时间】:2019-09-21 08:15:42
【问题描述】:

我试图对列表中的日期进行排序,但日期位于字符串元素 [EQUIP-X] 之后。首先使用正则表达式,取唯一的日期并尝试排序。它不起作用!

我想拆分字符串[EQUIP-X]Date

files = [filename for root, dirs, files in os.walk(path) for filename in files for date in dateList if filename.endswith(date+".log")]
for item in files:
 reg = re.search(r"(.+]).(\d{2}.\d{2}.\d{4})",item)
 equip = reg.group(1)
 data = reg.group(2)
 namefile = data+'.'+equip 
 print item
  • 组(1) - [EQUIP-X]
  • 组(2) - 日期

示例字符串:

[EQUIP-4].02.05.2019.log
[EQUIP-2].01.05.2019.log
[EQUIP-1].30.04.2019.log
[EQUIP-3].29.04.2019.log
[EQUIP-1].01.05.2019.log
[EQUIP-5].30.04.2019.log
[EQUIP-1].29.04.2019.log
[EQUIP-5].30.04.2019.log
[EQUIP-3].30.04.2019.log
[EQUIP-1].29.04.2019.log
[EQUIP-2].02.05.2019.log

按照这个tutorial,一旦我不是在操作“日期”而是“str”,“str”对象就没有属性“sort”。更好的方法是什么?想法是拆分和处理日期,然后加入所有

【问题讨论】:

标签: python regex sorting date python-2.x


【解决方案1】:

您可以根据字符串的结尾减去最后 4 个字符(文件扩展名)作为日期进行排序。由于日期格式是零填充的,因此它应该总是 10 个字符长,因此字符串拼接从 -14 开始(日期为 10 + 扩展为 4)

from datetime import datetime

files = ['[EQUIP-4].02.05.2019.log',
'[EQUIP-2].01.05.2019.log',
'[EQUIP-1].30.04.2019.log',
'[EQUIP-3].29.04.2019.log',
'[EQUIP-1].01.05.2019.log',
'[EQUIP-5].30.04.2019.log',
'[EQUIP-1].29.04.2019.log',
'[EQUIP-5].30.04.2019.log',
'[EQUIP-3].30.04.2019.log',
'[EQUIP-1].29.04.2019.log',
'[EQUIP-2].02.05.2019.log']

files.sort(key=lambda x: datetime.strptime(x[-14:-4], '%d.%m.%Y'))
print(files)
['[EQUIP-3].29.04.2019.log',
'[EQUIP-1].29.04.2019.log',
'[EQUIP-1].29.04.2019.log',
'[EQUIP-1].30.04.2019.log',
'[EQUIP-5].30.04.2019.log',
'[EQUIP-5].30.04.2019.log',
'[EQUIP-3].30.04.2019.log',
'[EQUIP-2].01.05.2019.log',
'[EQUIP-1].01.05.2019.log',
'[EQUIP-4].02.05.2019.log',
'[EQUIP-2].02.05.2019.log']

【讨论】:

    【解决方案2】:

    python sort 函数有一个key 参数,可让您在对元素进行排序之前对其进行修改。

    此示例从字符串末尾提取数字并按其排序。

    a = ['hello 123', 'pumpkin 542', 'muffin 342']
    
    def get_important_part(string):
        return int(string.split()[1])
    
    print(sorted(a, key=get_important_part))
    

    返回

    ['hello 123', 'muffin 342', 'pumpkin 542']

    【讨论】:

      【解决方案3】:

      为什么不使用strptimestrftime

      dates = ['02.05.2019', '20.05.2019', '11.05.2019', '30.05.2019', '08.05.2019', '09.05.2019']
      dates_obj = [datetime.strptime(x,'%d.%m.%Y') for x in dates]
      dates_sorted = sorted(dates_obj)
      dates_sorted = [x.strftime('%d.%m.%Y') for x in dates_sorted]
      print (dates_sorted)
      
      ['02/05/2019', '08/05/2019', '09/05/2019', '11/05/2019', '20/05/2019', '30/05/2019']
      

      【讨论】:

        【解决方案4】:

        您可以将列表转换为熊猫数据框,然后进行相应的排序。按年、月和日排序,然后将索引转换为列表。然后按索引(iloc)显示排序后的值。

        import pandas as pd
        df = pd.DataFrame([('[EQUIP-4].02.05.2019.log')
        ,('[EQUIP-2].01.05.2019.log')
        ,('[EQUIP-1].30.04.2019.log')
        ,('[EQUIP-3].29.04.2019.log')
        ,('[EQUIP-1].01.05.2019.log')
        ,('[EQUIP-5].30.04.2019.log')
        ,('[EQUIP-1].29.04.2019.log')
        ,('[EQUIP-5].30.04.2019.log')
        ,('[EQUIP-3].30.04.2019.log')
        ,('[EQUIP-1].29.04.2019.log')
        ,('[EQUIP-2].02.05.2019.log')], columns = ['file'])
        
        df.iloc[df['file'] \
              .map(lambda x: pd.to_datetime(x[-14:-4])) \
              .sort_values() \
              .index \
              .tolist()]
        

        结果:

                         file
        1   [EQUIP-2].01.05.2019.log
        4   [EQUIP-1].01.05.2019.log
        0   [EQUIP-4].02.05.2019.log
        10  [EQUIP-2].02.05.2019.log
        3   [EQUIP-3].29.04.2019.log
        6   [EQUIP-1].29.04.2019.log
        9   [EQUIP-1].29.04.2019.log
        2   [EQUIP-1].30.04.2019.log
        5   [EQUIP-5].30.04.2019.log
        7   [EQUIP-5].30.04.2019.log
        8   [EQUIP-3].30.04.2019.log
        

        【讨论】:

          【解决方案5】:

          结合@ddg和@Sayse的建议,你可以试试:

          import re
          from datetime import datetime
          
          files = ["[EQUIP-4].02.05.2019.log", ...]
          
          files.sort(key = lambda item: datetime.strptime(re.search(r"(?=.)(\d{2}.\d{2}.\d{4})(?=.)", item).group(0), '%d.%m.%Y'), reverse=False)
          

          或者以更易读的方式:

          def getSortValue(item):
            reg = re.search(r"(?=.)(\d{2}.\d{2}.\d{4})(?=.)", item)
            data = reg.group(0)
            return datetime.strptime(data, '%d.%m.%Y')
          
          files.sort(key = getSortValue, reverse = False)
          

          输出:

          print('\n'.join(files))
          
          [EQUIP-3].29.04.2019.log
          [EQUIP-1].29.04.2019.log
          [EQUIP-1].29.04.2019.log
          [EQUIP-1].30.04.2019.log
          [EQUIP-5].30.04.2019.log
          [EQUIP-5].30.04.2019.log
          [EQUIP-3].30.04.2019.log
          [EQUIP-2].01.05.2019.log
          [EQUIP-1].01.05.2019.log
          [EQUIP-4].02.05.2019.log
          [EQUIP-2].02.05.2019.log
          

          【讨论】:

            【解决方案6】:

            您可以使用内置的list sort() 函数对文件名进行排序,如下所示:

            from datetime import datetime
            import os  # Even though not used in example code.
            from pprint import pprint
            import re
            
            #files = [filename for root, dirs, files in os.walk(path) for filename in files for date in dateList if filename.endswith(date+".log")]
            files = [
                '[EQUIP-4].02.05.2019.log',
                '[EQUIP-2].01.05.2019.log',
                '[EQUIP-1].30.04.2019.log',
                '[EQUIP-3].29.04.2019.log',
                '[EQUIP-1].01.05.2019.log',
                '[EQUIP-5].30.04.2019.log',
                '[EQUIP-1].29.04.2019.log',
                '[EQUIP-5].30.04.2019.log',
                '[EQUIP-3].30.04.2019.log',
                '[EQUIP-1].29.04.2019.log',
                '[EQUIP-2].02.05.2019.log',
            ]
            
            def get_date(filename):
                match = re.search(r".+].(\d{2}.\d{2}.\d{4})",filename)
                date_str = match.group(1)
                return datetime.strptime(date_str, '%d.%m.%Y')
            
            files.sort(key=get_date)
            
            pprint(files)
            

            输出:

            ['[EQUIP-3].29.04.2019.log',
             '[EQUIP-1].29.04.2019.log',
             '[EQUIP-1].29.04.2019.log',
             '[EQUIP-1].30.04.2019.log',
             '[EQUIP-5].30.04.2019.log',
             '[EQUIP-5].30.04.2019.log',
             '[EQUIP-3].30.04.2019.log',
             '[EQUIP-2].01.05.2019.log',
             '[EQUIP-1].01.05.2019.log',
             '[EQUIP-4].02.05.2019.log',
             '[EQUIP-2].02.05.2019.log']
            

            【讨论】:

              猜你喜欢
              • 2021-10-17
              • 2018-05-18
              • 1970-01-01
              • 2010-12-18
              • 2014-05-20
              • 1970-01-01
              • 2021-05-08
              • 1970-01-01
              • 2012-04-12
              相关资源
              最近更新 更多