Как упростить мой кадр данных для повторной выборки в соответствии с конкретными правилами?

#python #pandas #dataframe

#питон #панды #фрейм данных

Вопрос:

У меня есть таблицы данных с частотой минут, Время [[’09:30:00′-’11:30:00′],[’13:00:00′-’15:00:00′]], Демо generate_date() , я хочу, чтобы изменить его разрешение, в соответствии с прошедшего часа, но каждый период времени будет закрыт до и после.

Мой подход заключается в resample() function :

  1. Добавьте немного времени влево.
  2. Повторите выборку до 30 т.
  3. Добавьте небольшое время до 10:00:00 и 11:00:00.
  4. Отдельные утренние и дневные данные.
  5. Данные утром снова пересчитываются в 30T, а данные днем пересчитываются в H.
  6. Объедините утренние и дневные данные.

Можно ли упростить мою 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 с. Если смещение вправо ,параметры повторной выборки будут закрыты=»влево», метка=»влево».