Как фильтровать dataframe DatetimeIndex с помощью contains

#python #pandas

#python #панды

Вопрос:

У меня есть dataframe, проиндексированный по datetime. Я пытаюсь создать какой-то фильтр, который предоставляет только кадры, содержащие определенное время.

Так, например, все кадры, содержащие «09:30»

 df.dtypes
open             float64
high             float64
low              float64
close            float64
volume             int64
returns          float64
returns_final      int64
dtype: object
  

Я могу сделать это на основе начала фрейма, но я не могу понять, можем ли мы использовать фильтры подстановочного типа.

 
df.loc['2020'].head(5)

                    open        high         low        close         volume    returns returns_final
Datetime                            
2020-07-06 09:30:00 255.337982  261.950012  253.208786  261.421997  6592145 -6.084015   1
2020-07-06 11:00:00 261.526001  268.399994  261.239990  266.275452  4955678 -4.749451   1
2020-07-06 12:30:00 266.269043  266.989990  264.200012  265.191986  2002640 1.077057    -1
2020-07-06 14:00:00 265.185455  269.558014  261.597992  268.513763  3303263 -3.328308   1
2020-07-06 15:30:00 268.528015  275.558014  268.096008  274.200012  2583149 -5.671997   1
2020-07-07 09:30:00 281.002014  285.641998  267.341980  277.621979  10130111    3.380035    -1
2020-07-07 11:00:00 278.000000  284.600006  276.536011  278.123718  4221461 -0.123718   1
2020-07-07 12:30:00 278.000000  282.000000  277.399994  280.131012  2394459 -2.131012   1
  

Я пытаюсь найти что-то в этом роде

 df.loc['*09:30*']
  

Думаю, мне, возможно, придется переиндексировать это или что-то в этом роде

Любой ввод будет оценен

Комментарии:

1. Думаю, я понял это. df.filter(like= ’09:30′, axis= 0) Есть ли лучший способ?

Ответ №1:

Вы можете использовать это:

 df[df.index.strftime('%H:%M:%S') == '09:30:00']
  

Вывод:

                            open        high         low       close    volume   returns  return_final
Datetime                                                                                             
2020-07-06 09:30:00  255.337982  261.950012  253.208786  261.421997   6592145 -6.084015             1
2020-07-07 09:30:00  281.002014  285.641998  267.341980  277.621979  10130111  3.380035            -1
  

Для нескольких раз в день:

 df[df.index.strftime('%H:%M:%S').isin(['09:30:00','11:00:00'])]
  

Вы можете использовать filter, как вы делаете с регулярным выражением:

 df.filter(regex='09:30|11:00', axis=0)
  

Вывод:

                                       open        high         low              close    volume  returns  return_final
Datetime                                                                                                              
2020-07-06 09:30:00 255.337982  261.950012  253.208786  261.421997  6592145 -6.084015  1.000000      NaN           NaN
2020-07-06 11:00:00 261.526001  268.399994  261.239990  266.275452  4955678 -4.749451  1.000000      NaN           NaN
2020-07-07 09:30:00 281.002014  285.641998  267.341980  277.621979           10130111  3.380035     -1.0           NaN
2020-07-07 11:00:00 278.000000  284.600006  276.536011  278.123718  4221461 -0.123718  1.000000      NaN           NaN
  

Комментарии:

1. Знаете ли вы, как я могу добавить к этому несколько раз? df[df.index.strftime(‘%H:%M:%S’) == ’09:30:00’amp;’11:00:00′] ??

2. Используйте isin со списком строк

Ответ №2:

Похоже, это работает.

 df.filter(like='09:30', axis=0)

    open    high    low close   volume  returns returns_final
Datetime                            
2020-07-06 09:30:00 255.337982  261.950012  253.208786  261.421997  6592145 -6.084015   1
2020-07-07 09:30:00 281.002014  285.641998  267.341980  277.621979  10130111    3.380035    -1
2020-07-08 09:30:00 281.000000  283.399994  277.662018  278.865784  4698944 2.134216    -1
2020-07-09 09:30:00 279.398010  281.500000  271.919983  272.015991  4562064 7.382019    -1
2020-07-10 09:30:00 278.220367  283.799988  275.202026  283.506012  4274774 -5.285645   1