#python #pandas #dataframe
#питон #панды #фрейм данных
Вопрос:
У меня есть таблицы данных с частотой минут, Время [[’09:30:00′-’11:30:00′],[’13:00:00′-’15:00:00′]], Демо generate_date()
, я хочу, чтобы изменить его разрешение, в соответствии с прошедшего часа, но каждый период времени будет закрыт до и после.
Мой подход заключается в resample() function
:
- Добавьте немного времени влево.
- Повторите выборку до 30 т.
- Добавьте небольшое время до 10:00:00 и 11:00:00.
- Отдельные утренние и дневные данные.
- Данные утром снова пересчитываются в 30T, а данные днем пересчитываются в H.
- Объедините утренние и дневные данные.
Можно ли упростить мою resample()
функцию?
Мой код выглядит следующим образом:
import pandas as pd import numpy as np import datetime def generate_data(): datetime1 = pd.date_range('2021-12-01 09:30:00', '2021-12-01 15:00:00', freq='t') df = pd.DataFrame(datetime1, columns=['datetime']) df['time'] = df.datetime.dt.strftime('%H:%M:%S') df = df[(df.time lt;= '11:30:00') | (df.time gt;= '13:00:00')].reset_index(drop=True) np.random.seed(2021) df['close'] = np.random.random(len(df)) * 100 return df def resample(df): df.loc[df['time'].isin(['09:30:00', '13:00:00']), 'datetime'] = df.loc[ df['time'].isin(['09:30:00', '13:00:00']), 'datetime'].apply(lambda x: x datetime.timedelta(seconds=0.001)) df = df.set_index('datetime') df = df.resample('30T', closed='right', label='right').last() df = df.dropna(subset=['close']) df = df.reset_index() df.loc[:, 'time'] = df.datetime.dt.strftime('%H:%M:%S') df.loc[df['time'].isin(['10:00:00', '11:00:00']), 'datetime'] = df.loc[ df['time'].isin(['10:00:00', '11:00:00']), 'datetime'].apply(lambda x: x datetime.timedelta(seconds=0.001)) df = df.set_index('datetime') df1 = df[df.time lt; '12:00:00'] df2 = df[df.time gt; '12:00:00'] df1 = df1.resample('30T', closed='right', label='right').last() df2 = df2.resample('H', closed='right', label='right').last() df = pd.concat([df1, df2]) df = df.dropna(subset=['close']) df = df.reset_index() return df def main(): df = generate_data() print('nBefore resample:') print(df) df = resample(df) print('nAfter resample:') print(df) if __name__ == '__main__': main()
Before resample: datetime time close 0 2021-12-01 09:30:00 09:30:00 60.597828 1 2021-12-01 09:31:00 09:31:00 73.336936 2 2021-12-01 09:32:00 09:32:00 13.894716 3 2021-12-01 09:33:00 09:33:00 31.267308 4 2021-12-01 09:34:00 09:34:00 99.724328 .. ... ... ... 237 2021-12-01 14:56:00 14:56:00 98.774245 238 2021-12-01 14:57:00 14:57:00 67.903063 239 2021-12-01 14:58:00 14:58:00 40.640360 240 2021-12-01 14:59:00 14:59:00 50.995722 241 2021-12-01 15:00:00 15:00:00 88.935107 [242 rows x 3 columns] After resample: datetime time close 0 2021-12-01 10:30:00 10:30:00 6.383650 1 2021-12-01 11:30:00 11:30:00 26.667989 2 2021-12-01 14:00:00 14:00:00 19.255257 3 2021-12-01 15:00:00 15:00:00 88.935107
Комментарии:
1. Вы хотите закрыть справа, но добавляете смещение 0,001 с, поэтому закрываете слева и не добавляете смещение, нет?
2. потому что у него 242 секунды,и мне нужно выполнить повторную выборку до 4 часов, поэтому смещение требуется только для одного из правых или левых. Я выбираю смещение влево , также могу смещать только вправо-0,001 с. Если смещение вправо ,параметры повторной выборки будут закрыты=»влево», метка=»влево».