【问题标题】:Sorting CSV files using date in file name使用文件名中的日期对 CSV 文件进行排序
【发布时间】:2021-03-27 04:02:57
【问题描述】:

我有一个 CSV 文件列表,这些文件位于我的 Google 驱动器上的一个文件中。主文件名为 all_files,CSV 文件如下所示。

all_files

['/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/11-07-2020.csv',
 '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/11-12-2020.csv',
 '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/07-28-2020.csv',
 '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/03-16-2020.csv',
 '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/07-18-2020.csv']

我正在尝试根据文件名中的日期(例如 2020 年 3 月 16 日)(基本上是 1 月 1 日到最新文件日期)对这些文件进行排序,并返回排序后的文件列表,同时保留所有文件数据。我不确定是否应该将它们作为字符串排序,因为结果排序不会携带文件数据。

提前感谢您的帮助

【问题讨论】:

  • 您是否有指定的字符串列表、open()ed 文件句柄列表或其他内容?
  • 只是一个字符串列表。使用 glob.glob 导入文件,并将数据路径分配给 all_files。当 all_files 运行时,输出就是上面列出的所有文件名,只是更多。
  • 啊,好吧,所以“不会随身携带文件数据”是指它没有原始文件名吗?幸运的是 sort[ed]key= 关键字,正是这种事情
  • 是的,我相信这会成功
  • 我在下面贴了一些代码给你看看

标签: python csv sorting date


【解决方案1】:

此解决方案为每个文件名 fn 构建一个 (year, month, day) 元组,然后只使用 Python 的内置排序,它将前后比较一个元组

# gets 'mm-dd-yyyy' part of filename string
get_date = lambda fn: fn.split('/')[-1].split('.')[0].split('-')

# actual sorting using tuples
sorted(all_files, key=
        lambda fn: (get_date(fn)[2], get_date(fn)[0], get_date(fn)[1]))

【讨论】:

    【解决方案2】:

    由于您的日期都在 2020 年,并且日期之前的月份数字,并且每个月和日都有两个数字,并且两个文件名之间的唯一区别是日期:天真地对字符串列表进行排序会产生正确的顺序。

    一般来说,为了正确解析日期,我建议使用datetime.datetime.strptime。您可以将其作为key 参数提供给sortedlist.sort

    import datetime
    
    allfiles = [
      '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/11-07-2020.csv',
      '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/11-12-2020.csv',
      '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/07-28-2020.csv',
      '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/03-16-2020.csv',
      '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/07-18-2020.csv'
    ]
    
    naively_sorted = sorted(allfiles)
    
    sorted_by_date = sorted(allfiles,
                            key=lambda x: datetime.datetime.strptime(x[-14:-4], '%m-%d-%Y'))
    
    print(naively_sorted)
    print(sorted_by_date)
    
    # ['/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/03-16-2020.csv', '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/07-18-2020.csv', '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/07-28-2020.csv', '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/11-07-2020.csv', '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/11-12-2020.csv']
    # ['/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/03-16-2020.csv', '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/07-18-2020.csv', '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/07-28-2020.csv', '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/11-07-2020.csv', '/content/drive/MyDrive/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/11-12-2020.csv']
    

    请注意,切片 x[-14:-4] 不假设字符串的开头是什么样的;但它确实假设字符串以"mm-dd-yyyy.csv" 结尾。

    【讨论】:

      猜你喜欢
      • 2018-09-02
      • 2021-09-07
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 2021-04-06
      • 2021-02-17
      相关资源
      最近更新 更多