У меня есть набор данных о ценах на валюту каждую минуту, 24 часа в сутки, каждый день, в течение одного месяца. Тем не менее, рынок форекс только открыт с 17:00 в воскресенье до 16:00 в пятницу, данные между этими временами просто дополняются последним записанным значением в пятницу вечером. Я пытаюсь удалить это дополнение и оставить только данные с открытым рынком.Как извлечь подмножество временного ряда в соответствии с пользовательским интервалом, используя pandas?
Я спустил десятки тупиков и полностью потерял лес для деревьев.
Это красиво просто возвращать подмножество данных в соответствии с заданным сроки:
import pandas as pd
df = pd.read_csv(tickdatafile,index_col='dtime',parse_dates=True)
# Return all rows for times between 12:00 and 16:00
df = df.between_time('12:00','16:00')
Первые две строки создают dataframe из файла CSV, выделить столбец «DTIME» как index и проанализировать его как объект datetime. Третья строка возвращает все строки между 12:00 и 16:00 независимо от того, в какой день.
Простое решение одна строка будет выглядеть (псевдокод):
df = df.between_customTimeRange('Sun 17:00','Fri 16:00')
, но очевидно, что это не работает.
Есть ли что-то простое, что я полностью забыл?
Edit: Я объединил EKomarov и ответы Александра в следующее решение от начала до конца:
import pandas as pd
df = pd.read_csv(tickdatafile,index_col='dtime',parse_dates=True)
mask = df[ (( df.index.weekday == 6) & (df.index.hour < 17))# Sunday pre 17:00
| ( df.index.weekday == 5) # All of Saturday
| (( df.index.weekday == 4) # Friday
& ( (df.index.hour >= 16) # Friday 16.00 onwards
& ~((df.index.hour == 16)
& (df.index.minute == 0)# Exclude 16.00 itself
)
)
)
]
df = df[~df.index.isin(mask.index)] # return all data not in mask
df.to_csv(tradingdaysonly)
Это прекрасно работает. Спасибо! – Tom