Снова и снова в пандах я нахожу, что мне нужно разделить на определенное время. Например, за каждый день во временном ряду разделите каждое значение на значение в 12:00.Python pandas time series сравнить конкретные времена
Я чувствую, что это должно быть довольно простой операцией, но я не нашел простых решений.
Например, я хочу, чтобы выполнить функцию на каждый день во временных рядах:
x = df.groupby(df.index.date).apply(func)
За каждый день, сделайте следующее:
def func(df):
st = df.between_time('10:00','10:00')['y-value']
end = df.between_time('14:45','14:45')['y-value']
return (st/end)
Во-первых, есть ли способ сказать, df.at_time ('10: 00')? Кажется окольным писать здесь .between_time() здесь, но он работает. Я также пробовал df.index.time, но я не уверен, как сказать: == datetime.time (10,0), потому что это возвращает логический массив, а не просто значение в 10:00 утра.
Функция не работает, потому что, по моему мнению, это проблема индексации, она выплевывает N/A при каждом значении и выплевывает два значения за каждый день (то есть один в 10:00 и 14:45), Не один. Это работает, если они в одно и то же время, но не в разное время. Я убежден, что арифметические операции не работают чисто в разные даты.
Я также попытался:
def func(df):
st = df.reset_index().between_time('10:00','10:00')['mid'].values[0]
end = df.reset_index().between_time('14:45','14:45')['mid'].values[0]
return (st/end)
И я получаю ошибку индексации говоря мне нужно вернуть DateTimeIndex. Я полагаю, что я не могу просто делить значения через, и он вернет это значение на соответствующую дату, но ему нужно вернуть какой-то объект (индекс, значение) pandas.
Любые идеи? Это обычная операция?
Вот что мой набор данных выглядит (используйте pd.read_clipboard() для чтения в):
bid ask mid
2000-01-01 12:00:00 288.0 289.5 288.75
2000-01-01 13:30:00 287.8 288.6 288.20000000000005
2000-01-01 14:00:00 287.75 289.25 288.5
2000-01-03 09:30:00 288.5 289.5 289.0
2000-01-03 10:15:00 288.5 289.5 289.0
2000-01-03 10:30:00 289.0 290.0 289.5
2000-01-03 10:45:00 288.75 289.75 289.25
2000-01-03 11:45:00 288.75 289.75 289.25
2000-01-03 13:00:00 288.5 289.5 289.0
2000-01-03 13:15:00 288.5 289.5 289.0
2000-01-03 13:30:00 288.5 289.5 289.0
2000-01-04 09:00:00 281.5 282.25 281.875
2000-01-04 09:15:00 281.0 281.5 281.25
2000-01-04 09:30:00 281.25 281.75 281.5
2000-01-04 09:45:00 281.1 281.85 281.475
2000-01-04 10:00:00 281.7 282.2 281.95
2000-01-04 10:30:00 282.0 282.75 282.375
2000-01-04 10:45:00 282.2 282.95 282.575
2000-01-04 11:15:00 282.3 282.8 282.55
2000-01-04 11:30:00 281.45 282.2 281.825
UPDATE: Временное решение, но я искал что-то более чистого (возможно она не существует)
st_time, end_time = '8:00', '14:45'
st, end = df.at_time(st_time), df.at_time(end_time)
AM = st.merge(end, on='date', how='left').dropna()
AM = AM.set_index(pd.DatetimeIndex(AM['date']))
AM['AM return'] = (AM[end_time]/AM[st_time]) - 1
AM = AM.rename(columns={'price_x': st_time+' price', 'price_y': end_time+' price'})
показать пример того, что вы ожидаете для вывода – Jeff
У вас нет значения в течение 12 часов каждый день, только в первый день. –
try return '(st/end.values)' – HYRY