83618


以下のような期間を含むDataFrameで、指定した日付が期間内に含まれる行を抽出するには、どうしたらよいでしょうか？  
例えば、'2021/08/05'を検索条件としたとき、りんごの行を抽出することは可能でしょうか？（applyや行ループするしかないのでしょうか？）  
よろしくお願いします。

[code]

    import pandas as pd
    df = pd.DataFrame(
        data={ '品名':[ 'りんご', 'バナナ', 'みかん' ] },
        index=[
            pd.Interval(pd.Timestamp('2021/08/01'), pd.Timestamp('2021/08/10')),
            pd.Interval(pd.Timestamp('2021/09/01'), pd.Timestamp('2021/09/10')),
            pd.Interval(pd.Timestamp('2021/10/01'), pd.Timestamp('2021/10/10')) ]
    )
    display(df)
    
[/code]


CC BY-SA 4.0
2021-11-14T12:36:10.650
83615
2021-11-15T08:57:21.257
2021-11-14T13:01:34.000
7290
35267
question
python pandas
期間を含むDataFrameの条件抽出


[pandas.IntervalIndex.contains()](https://pandas.pydata.org/docs/reference/api/pandas.IntervalIndex.contains.html)あたりの応用で以下のように出来そうです。

[code]

    selected = df[df.index.contains('2021/08/05')]
    
[/code]

* * *

何で`pd.Timestamp('2021/08/01
00:01')`を使った回答されたか不思議だったのですが、上記方法だと'2021/08/01'の時に検出出来ないからですね。  
これはDataFrame作成時の指定方法が関係していると考えられます。

[code]

    pd.Interval(pd.Timestamp('2021/08/01'), pd.Timestamp('2021/08/10'))
    
[/code]

上記の方法で作成すると、`closed`パラメータが指定されていないためデフォルトの`right`になって、`left`パラメータに指定した値は`Interval`に含まれないことになります。  
[pandas.Interval()](https://pandas.pydata.org/docs/reference/api/pandas.Interval.html)

> closed : {‘right’, ‘left’, ‘both’, ‘neither’}, default ‘right’  
>  Whether the interval is closed on the left-side, right-side, both or
> neither. See the Notes for more detailed explanation.

notes の記述に依れば期間は '2021/08/01' < Interval <= '2021/08/10' となります。  
そうなると'2021/08/01'が含まれていないことになるため、`selected =
df[df.index.contains('2021/08/01')]`は空のDataFrameになります。

'2021/08/01'を指定して'りんご'を含んだ行を抽出するためには、DataFrame作成時に以下のように`,
closed='both'`を追加しておけば良いでしょう。

[code]

    df = pd.DataFrame(
        data={ '品名':[ 'りんご', 'バナナ', 'みかん' ] },
        index=[
            pd.Interval(pd.Timestamp('2021/08/01'), pd.Timestamp('2021/08/10'), closed='both'),
            pd.Interval(pd.Timestamp('2021/09/01'), pd.Timestamp('2021/09/10'), closed='both'),
            pd.Interval(pd.Timestamp('2021/10/01'), pd.Timestamp('2021/10/10'), closed='both') ]
    )
    
[/code]

上記のようにDataFrameを作成することで、`pd.Timestamp('2021/08/01
00:01')`と言う風に捻り技を使うことなく、`df_out =
df[df.index.contains('2021/08/01')]`で希望する行が抽出できるでしょう。


CC BY-SA 4.0
2021-11-14T13:51:34.777
83618
2021-11-15T08:08:31.070
2021-11-15T08:08:31.070
26370
26370
83615
answer


ありがとうございます。  
`index.contains()` を利用して抽出することで解決しました。

Pandasのindex系のAPIたくさんあるのですね。

[code]

    import pandas as pd
    df = pd.DataFrame(
        data={ '品名':[ 'りんご', 'バナナ', 'みかん' ] },
        index=[
            pd.Interval(pd.Timestamp('2021/08/01'), pd.Timestamp('2021/08/10')),
            pd.Interval(pd.Timestamp('2021/09/01'), pd.Timestamp('2021/09/10')),
            pd.Interval(pd.Timestamp('2021/10/01'), pd.Timestamp('2021/10/10')) ]
    )
    display(df)
    
    df_out = df[df.index.contains(pd.Timestamp('2021/08/01 00:01'))]
    display(df_out)
    
[/code]


CC BY-SA 4.0
2021-11-15T04:38:49.500
83628
2021-11-15T08:57:21.257
2021-11-15T08:57:21.257
3060
35267
83615
answer