Pandasで日付処理する。

# はじめに
エクセルファイルをpandasでデータフレームにしたとき、日付が、タイムスタンプになっている時と、文字列になっている時がある。処理しやすくするようにフォーマットを変換する方法をまとめる。

## エクセルファイルの例
A,B列は日付フォーマット、C,Dは文字列フォーマット。ファイル名は「pandas_day.xlsx」とする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/47960595-1ed9-02ad-ec55-0d221f9ad250.png)

## 各列のフォーマット確認
日付フォーマットは```timestamp```で文字列フォーマットは```str```でデータフレームになる。
```python
import pandas as pd

df = pd.read_excel('pandas_day.xlsx',)

# 値
print(f"{df}")

#            A          B         C          D
# 0 2020-02-01 2020-02-01  2020/2/1  2020年2月1日
# 1 2020-02-02 2020-02-02  2020/2/2  2020年2月2日
# 2 2020-02-03 2020-02-03  2020/2/3  2020年2月3日
# 3 2025-02-01 2025-02-01  2025/2/1  2025年2月1日
# 4 2025-02-02 2025-02-02  2025/2/2  2025年2月2日
# 5 2025-02-03 2025-02-03  2025/2/3  2025年2月3日
# 6 2025-03-01 2025-03-01  2025/3/1  2025年3月1日
# 7 2025-03-02 2025-03-02  2025/3/2  2025年3月2日
# 8 2025-03-03 2025-03-03  2025/3/3  2025年3月3日

# type確認
print(f"{type(df['A'][0])=}\n{type(df['B'][0])=}\n{type(df['C'][0])=}\n{type(df['D'][0])=}")

# type(df['A'][0])=<class 'pandas._libs.tslibs.timestamps.Timestamp'>
# type(df['B'][0])=<class 'pandas._libs.tslibs.timestamps.Timestamp'>
# type(df['C'][0])=<class 'str'>
# type(df['D'][0])=<class 'str'>


```

## Timestampsへ変換する
```pd.to_datetime()```で変換できる。```format=```で文字列のフォーマットを指定して変換する。
```python
import pandas as pd

df = pd.read_excel('pandas_day.xlsx',)

# 日時変更
df['C']=pd.to_datetime(df['C'], format='%Y/%m/%d')
df['D'] = pd.to_datetime(df['D'], format='%Y年%m月%d日')

# 値
print(f"{df}")

#            A          B         C          D
# 0 2020-02-01 2020-02-01 2020-02-01 2020-02-01
# 1 2020-02-02 2020-02-02 2020-02-02 2020-02-02
# 2 2020-02-03 2020-02-03 2020-02-03 2020-02-03
# 3 2025-02-01 2025-02-01 2025-02-01 2025-02-01
# 4 2025-02-02 2025-02-02 2025-02-02 2025-02-02
# 5 2025-02-03 2025-02-03 2025-02-03 2025-02-03
# 6 2025-03-01 2025-03-01 2025-03-01 2025-03-01
# 7 2025-03-02 2025-03-02 2025-03-02 2025-03-02
# 8 2025-03-03 2025-03-03 2025-03-03 2025-03-03

# type確認
print(f"{type(df['A'][0])=}\n{type(df['B'][0])=}\n{type(df['C'][0])=}\n{type(df['D'][0])=}")

# type(df['A'][0])=<class 'pandas._libs.tslibs.timestamps.Timestamp'>
# type(df['B'][0])=<class 'pandas._libs.tslibs.timestamps.Timestamp'>
# type(df['C'][0])=<class 'pandas._libs.tslibs.timestamps.Timestamp'>
# type(df['D'][0])=<class 'pandas._libs.tslibs.timestamps.Timestamp'>

```

## 日付で行フィルタする
```dt.year```、```dt.month```、```dt.day```で日付をフィルタできる。
```python
import pandas as pd

df = pd.read_excel('pandas_day.xlsx',)

# 2020年だけフィルタ
df_2020=df[df['A'].dt.year == 2020]
# 値
print(f"{df_2020}")

#            A          B          C          D
# 0 2020-02-01 2020-02-01 2020-02-01 2020-02-01
# 1 2020-02-02 2020-02-02 2020-02-02 2020-02-02
# 2 2020-02-03 2020-02-03 2020-02-03 2020-02-03


# 2月だけフィルタ
df_2=df[df['A'].dt.month == 2]
# 値
print(f"{df_2}")

#            A          B          C          D
# 0 2020-02-01 2020-02-01 2020-02-01 2020-02-01
# 1 2020-02-02 2020-02-02 2020-02-02 2020-02-02
# 2 2020-02-03 2020-02-03 2020-02-03 2020-02-03
# 3 2025-02-01 2025-02-01 2025-02-01 2025-02-01
# 4 2025-02-02 2025-02-02 2025-02-02 2025-02-02
# 5 2025-02-03 2025-02-03 2025-02-03 2025-02-03
```

## フォーマット指定をして文字列に変換する
```dt.strftime()```でフォーマットを指定して文字列に変換できる。
```python
import pandas as pd

df = pd.read_excel('pandas_day.xlsx',)

# 日付を文字列に変更
df['A']=df['A'].dt.strftime('%Y年%m月%d日')
df['B']=df['B'].dt.strftime('%Y年%m月%d日')
df['C']=df['C'].dt.strftime('%Y年%m月%d日')
df['D']=df['D'].dt.strftime('%Y年%m月%d日')
# 値
print(f"{df}")

#              A            B            C            D
# 0  2020年02月01日  2020年02月01日  2020年02月01日  2020年02月01日
# 1  2020年02月02日  2020年02月02日  2020年02月02日  2020年02月02日
# 2  2020年02月03日  2020年02月03日  2020年02月03日  2020年02月03日
# 3  2025年02月01日  2025年02月01日  2025年02月01日  2025年02月01日
# 4  2025年02月02日  2025年02月02日  2025年02月02日  2025年02月02日
# 5  2025年02月03日  2025年02月03日  2025年02月03日  2025年02月03日
# 6  2025年03月01日  2025年03月01日  2025年03月01日  2025年03月01日
# 7  2025年03月02日  2025年03月02日  2025年03月02日  2025年03月02日
# 8  2025年03月03日  2025年03月03日  2025年03月03日  2025年03月03日

# type確認
print(f"{type(df['A'][0])=}\n{type(df['B'][0])=}\n{type(df['C'][0])=}\n{type(df['D'][0])=}")

# type(df['A'][0])=<class 'str'>
# type(df['B'][0])=<class 'str'>
# type(df['C'][0])=<class 'str'>
# type(df['D'][0])=<class 'str'>
```
以上