【问题标题】:How to select specific csv files for specified date range from a folder in python?如何从python中的文件夹中选择指定日期范围的特定csv文件?
【发布时间】:2022-11-11 21:59:21
【问题描述】:

我有一个文件夹(与 python 脚本位于同一目录中),其中包含从 1 月 1 日到 12 月 31 日开始的大量 csv 文件,我只想将特定日期范围内的特定 csv 文件从文件夹读取到 python 中,然后附加文件到一个列表中。

文件命名如下,多个月的每一天都有文件:

BANK_NIFTY_5MINs_2020-02-01.csv, BANK_NIFTY_5MINs_2020-02-02.csv, ... BANK_NIFTY_5MINs_2020-02-28.csv, BANK_NIFTY_5MINs_2020-03-01, .... BANK_NIFTY_5MINs_2020-03-31 等等。

目前,我有代码通过使用“startswith”和“endswith”语法来获取整个 3 月的 csv 文件。但是,这样做可以让我一次只定位一个月的文件。 我希望能够在指定的日期范围内读取多个月的 csv 文件,例如 10 月、11 月和 12 月或 2 月和 3 月(基本上在任何月份开始和结束)。

以下代码仅获取 March 的文件。

#Accessing csv files from directory
all_files = []
path = os.getcwd()    
for root, dirs, files in os.walk(path):
    for file in files:
        if file.startswith("/BANK_NIFTY_5MINs_2020-03") and file.endswith(".csv"):
            all_files.append(os.path.join(root, file))

【问题讨论】:

    标签: python regex dataframe


    【解决方案1】:

    如果你想用正则表达式来做,这里是:

    # replace `file.startswith(...) and file.endswith(...)`
    re.match('BANK_NIFTY_5MINs_2020-(02|03|10|11|12)-[0-9]+', file)
    ###                              ^^^^^^^^^^^^^^ Feb, Mar, Oct-Dec
    

    这是让你开始的最基本的一个,它可能会得到改进。


    但在你的情况下,我会选择简单的glob

    all_files = glob.glob('./BANK_NIFTY_5MINs_2020-0[2-3]-*.csv')
    

    【讨论】:

      【解决方案2】:

      我会采用不同的方法来获得更大的灵活性

      import os
      from datetime import datetime
      from pprint import pprint
      
      
      def quick_str_to_date(s: str) -> datetime:
          return datetime.strptime(s, "%Y-%m-%d")
      
      
      def get_file_by_date_range(path: str, startdate: datetime or str, enddate: datetime or str) -> list:
          if type(startdate) == str:
              startdate = quick_str_to_date(startdate)
          if type(enddate) == str:
              enddate = quick_str_to_date(enddate)
          result = []   
          for root, dirs, files in os.walk(path):
              for filename in files:
                  if filename.startswith("BANK_NIFTY_5MINs_") and filename.lower().endswith(".csv"):
                      file_date = datetime.strptime(os.path.basename(filename), "BANK_NIFTY_5MINs_%Y-%m-%d.csv")
                      if startdate <= file_date <= enddate:
                          result.append(filename)
          return result
      
      
      print("all")
      pprint(get_file_by_date_range("path/to/files", "2000-01-01", "2100-12-31"))
      
      print("
      febuari")
      pprint(get_file_by_date_range("path/to/files", "2020-02-01", "2020-02-28"))
      
      print("
      one day")
      pprint(get_file_by_date_range("path/to/files", "2020-02-01", "2020-02-01"))
      

      输出

      all
      ['BANK_NIFTY_5MINs_2020-02-01.csv',
       'BANK_NIFTY_5MINs_2020-02-02.csv',
       'BANK_NIFTY_5MINs_2020-02-28.csv',
       'BANK_NIFTY_5MINs_2020-03-01.csv',
       'BANK_NIFTY_5MINs_2020-03-31.csv']
      
      febuari
      ['BANK_NIFTY_5MINs_2020-02-01.csv',
       'BANK_NIFTY_5MINs_2020-02-02.csv',
       'BANK_NIFTY_5MINs_2020-02-28.csv']
      
      one day
      ['BANK_NIFTY_5MINs_2020-02-01.csv']
      

      【讨论】:

      • 谢谢你。这适用于我的代码以将我想要的 csv 文件添加到列表中,但我无法进一步处理它,我尝试将列表中的所有文件合并到一个数据框中。它给出了一个错误,说没有这样的文件或目录。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2015-06-22
      • 1970-01-01
      • 2018-09-10
      相关资源
      最近更新 更多