如何根据 Python 上的文件名识别数据间隙?

How to identify data gaps based on filenames on Python?

碰巧我有一个文件夹位于

C:\Users\StoreX\Downloads\Binance futures data\AliceUSDT-Mark_Prices_Klines_1h_Timeframe

仅包含 253 个 csv 文件,文件名如下:

1. ALICEUSDT-1h-2021-06-01.csv
2. ALICEUSDT-1h-2021-06-02.csv
3. ALICEUSDT-1h-2021-06-03.csv
4. ALICEUSDT-1h-2021-06-06.csv
5. ALICEUSDT-1h-2021-06-09.csv
6. ALICEUSDT-1h-2021-06-11.csv
7. ALICEUSDT-1h-2021-06-12.csv
.
.
.
253. ALICEUSDT-1h-2022-02-13.csv

这些文件中的每一个都包含特定资产的每小时价格行为,共有 24 行(无列名),因此,可以假设 每个文件名对应于价格行为在特定日期为特定资产获取的数据

但是,如果仔细观察上面的示例,会发现开头部分缺少一些文件,它们是:

ALICEUSDT-1h-2021-06-04.csv
ALICEUSDT-1h-2021-06-05.csv
ALICEUSDT-1h-2021-06-07.csv
ALICEUSDT-1h-2021-06-08.csv
ALICEUSDT-1h-2021-06-10.csv

这显然意味着我在制定交易策略时无法考虑丢失文件之前的那些文件。

因此,我首先必须根据其名称检测丢失了哪些文件,然后定义从何处开始绘制价格行为以避免所有可能的差距。

更新:这是我到目前为止所做的:

import os
import datetime

def check_path(infile):
    return os.path.exists(infile)   

first_entry = input('Tell me the path where your csv files are located at:')

while True:
    
    if check_path(first_entry) == False:
        print('\n')
        print('This PATH is invalid!')
        first_entry = input('Tell me the RIGHT PATH in which your csv files are located: ')
        
    elif check_path(first_entry) == True:
        print('\n')
        final_output = first_entry
        break

for name in os.listdir(first_entry):
    if name.endswith(".csv"):
        print((name.partition('-')[-1]).partition('-')[-1].removesuffix(".csv"))

输出:

2021-06-01
2021-06-02
2021-06-03
2021-06-06
2021-06-09
.
.
.
2022-02-13

有什么想法吗?

IIUC,您有一个日期列表,如果您将列表与基于列表中的最小和最大日期的日期范围进行比较,则尝试找出缺少的日期。 Sets 可以提供帮助,例如:

import re
from datetime import datetime, timedelta

l = ["ALICEUSDT-1h-2021-06-01.csv",
     "ALICEUSDT-1h-2021-06-02.csv",
     "ALICEUSDT-1h-2021-06-03.csv",
     "ALICEUSDT-1h-2021-06-06.csv",
     "ALICEUSDT-1h-2021-06-09.csv",
     "ALICEUSDT-1h-2021-06-11.csv",
     "ALICEUSDT-1h-2021-06-12.csv"]

# extract the dates, you don't have to use a regex here, it's more for convenience
d = [re.search(r"[0-9]{4}\-[0-9]{2}\-[0-9]{2}", s).group() for s in l]

# to datetime
d = [datetime.fromisoformat(s) for s in d]

# now make a date range based on min and max dates in d
r = [min(d)+timedelta(n) for n in range((max(d)-min(d)).days+1)]

# ...so we can do a membership test with sets to find out what is missing...
missing = set(r) - set(d)

sorted(missing)
[datetime.datetime(2021, 6, 4, 0, 0),
 datetime.datetime(2021, 6, 5, 0, 0),
 datetime.datetime(2021, 6, 7, 0, 0),
 datetime.datetime(2021, 6, 8, 0, 0),
 datetime.datetime(2021, 6, 10, 0, 0)]