81041
### 前提・実現したいこと

Ppython, Pandasを使って、A列に08の月が含んでいる日付だけフィルターしたいです。

ただ下記のエラーが表示されます。

```

    raise AttributeError("Can only use .str accessor with string values!")
    
```

strからdtへ変換しましたがそれでも同じエラーが出ます。  
08の日付形式を合わせないといけないでしょうか。

```

    filter_A = df2['A'].dt.contains('08')
    
```

Excel data

```

    A
    2021-07-05 00:00:00
    2021-07-15 00:00:00
    2021-08-02 00:00:00
    2021-08-03 00:00:00
    
```

code

```

    import pandas as pd
    from datetime import datetime as dt, date, timedelta
    
    df = pd.read_excel('C:\\test.xlsx',sheet_name ='A')
    
    # print(df) 
    
    filter_A = df['A'].str.contains('08')
    
```

### 補足情報（Python/ツールのバージョンなど）

Python 3.9.5, Windows10の仮想環境で利用しています。

もしわかる方いれば、教えていただけるとありがたいです。  
よろしくお願いいたします。
CC BY-SA 4.0
2021-08-24T03:14:29.590
81002
2021-08-25T14:09:35.920
2021-08-24T04:58:20.400
3060
18859
question
python pandas
Python pandas 日付の.str AttributeErrorエラーについて
(解決しているようだけど, とりあえず回答として)

excel手元にないので CSV で行います

```

    import pandas as pd
    import io
    
    csv_data = '''
    indx,num,date
    AA,123, 2021.7.10
    BB,246, 2021.8.10
    CC,337, 2021.8.20
    DD,312, 2021.9.10
    '''
    
    df = pd.read_csv(io.StringIO(csv_data), index_col=0)
    print(df.to_markdown()) # display(df)
    
```

indx | num | date  
---|---|---  
AA | 123 | 2021.7.10  
BB | 246 | 2021.8.10  
CC | 337 | 2021.8.20  
DD | 312 | 2021.9.10  
  
例えば, 数値データ (`num` 項目) を `str`型に変換すると,  
( **`str`型に変換できたなら**) `str` accessor (アクセサ) を使用し, Pythonの `str`型に基づくメソッドが利用可能  
[str.contains](https://pandas.pydata.org/docs/reference/api/pandas.Series.str.contains.html)
も呼び出し可能

参考:

  * (docs.python.org) [文字列メソッド](https://docs.python.org/ja/3/library/stdtypes.html#string-methods)
  * [pandas.Series.str](https://pandas.pydata.org/docs/reference/api/pandas.Series.str.html)

> Patterned after Python’s string methods, with some inspiration from R’s
> stringr package.

以下, 上記データに基づく実行例

```

    # dtype は int64 なので数値型
    print(df['num'])
    # indx
    # AA    123
    # BB    246
    # CC    337
    # DD    312
    # Name: num, dtype: int64
    
    # 数値型なので四則演算可能
    print(df['num'] *2)
    # indx
    # AA    246
    # BB    492
    # CC    674
    # DD    624
    # Name: num, dtype: int64
    
    # 文字列型に変換し, .str accessor を使用
    print(df['num'].astype(str).str.replace('2', 'Hey'))
    # indx
    # AA    1Hey3
    # BB    Hey46
    # CC      337
    # DD    31Hey
    # Name: num, dtype: object
    
```

また, `datetime64[ns]`型（`Timestamp`型）に変換すると,  
`dt` accessor (アクセサ) を使用することで datetimeライクに扱える

参考:

  * 'dt' accessor [pandas.Series.dt](https://pandas.pydata.org/docs/reference/api/pandas.Series.dt.html)
  * [pandas.Series.dt.month](https://pandas.pydata.org/docs/reference/api/pandas.Series.dt.month.html)
  * [datetime オブジェクト](https://docs.python.org/ja/3/library/datetime.html#datetime.datetime) の Class attributes に `month`などが含まれる

```

    # datetime64 型に変換し, 項目に割り当て
    df['ts'] = pd.to_datetime(df['date'])
    print(df['ts'])
    # indx
    # AA   2021-07-10
    # BB   2021-08-10
    # CC   2021-08-20
    # DD   2021-09-10
    # Name: ts, dtype: datetime64[ns]
    
    # .dt accessor を使用し .month 属性にアクセス可能 (メソッドも呼び出し可能)
    print(df['ts'].dt.month)
    # indx
    # AA    7
    # BB    8
    # CC    8
    # DD    9
    # Name: ts, dtype: int64
    
    # 加工後の DataFrame
    print(df.dtypes)
    # num              int64
    # date            object
    # ts      datetime64[ns]
    # dtype: object
    print(df.to_markdown()) # display(df)
    
```

indx | num | date | ts  
---|---|---|---  
AA | 123 | 2021.7.10 | 2021-07-10 00:00:00  
BB | 246 | 2021.8.10 | 2021-08-10 00:00:00  
CC | 337 | 2021.8.20 | 2021-08-20 00:00:00  
DD | 312 | 2021.9.10 | 2021-09-10 00:00:00  
  
* * *

質問にあるエラーは

> AttributeError("Can only use .str accessor with string values!")

(意訳) 文字列であれば `.str` accessor (アクセサ) を使うことができる  
⇨ (指定のオブジェクトが)文字列型でないことを意味する

> strからdtへ変換しましたがそれでも同じエラーが出ます。

どのように変換したか質問に記されていないけど  
変換していないか, あるいは変換したけど結果を代入していないか … などの理由が考えられます
CC BY-SA 4.0
2021-08-25T14:09:35.920
81041
2021-08-25T14:09:35.920
43025
81002
answer