#はじめに
pandasで、日時データの粒度を変換する作業は少し面倒だったりします。
resampleなどを使う方法もありますが、indexに入ってないといけないのと、
Seriesを単純に変換したいだけの場合もあると思います。
そんなとき、Series.dt()を使うと便利です!
##日付の文字列の列に対してto_datetimeを適用
次のような日時データがあったとします。
data = pd.read_csv(".../Downloads/sample.csv")
print(data)
# date value
# 0 2016/5/1 0:03 45
# 1 2017/9/1 0:04 4
# 2 2016/3/1 0:06 23
# 3 2018/4/1 0:06 12
# 4 2017/7/12 0:06 78
# 5 2018/1/12 0:07 33
# 6 2018/2/1 0:10 55
# 7 2018/3/1 0:12 32
# 8 2018/4/1 0:13 76
このデータのdateカラムに入っている日付は、何時何分まで入っていますね。
今回はこれを日付まで丸めます。
まずpandasは日付をデフォルトで読み込むと文字列型になるので、
この日付データを、to_datetimeメソッドを使ってdatetime型に変換してやる必要があります。
#型の確認
data.dtypes
# date object
# value float64
# dtype: object
#to_datetime で日時型に変換
data['date'] = pd.to_datetime(data['date'])
#型の確認
data.dtypes
#date datetime64[ns]
#value float64
#dtype: object
#日付のカラムがdatetime64型になっている
##いざ変換!
Series.dt()メソッドを使って日時データを変換していきます。
先ほど見たようにdateカラムは、何時何分まで日時データが入っていますが、
これを日付までにして返すには、Series.dt.dateを使います。
data['date'] = data['date'].dt.date
print(data)
# date value
# 0 2016/5/1 45
# 1 2017/9/1 4
# 2 2016/3/1 23
# 3 2018/4/1 12
# 4 2017/7/12 78
# 5 2018/1/12 33
# 6 2018/2/1 55
# 7 2018/3/1 32
# 8 2018/4/1 76
ジャジャーン!日付まで丸まって、欲しい粒度のnumpy配列を返してくれます。
ちなみに、Series.dt.dayofweekを使うと、月曜日= 0、日曜日= 6にして返してくれます。
data['date'] = data['date'].dt.dayofweek
print(data)
# date value
# 0 6.0 45
# 1 4.0 4
# 2 1.0 23
# 3 6.0 12
# 4 2.0 78
# 5 4.0 33
# 6 3.0 55
# 7 3.0 32
# 8 6.0 76
うまく変換できていますね。
他にもたくさんあります。以下でまとめてみました。
Datetime Properties | 内容 |
---|---|
Series.dt.date | datetime.dateオブジェクトのnumpy配列を返します |
Series.dt.time | datetime.timeのnumpy配列を返します |
Series.dt.year | 日時の年 |
Series.dt.month | 月は1月= 1、12月= 12 |
Series.dt.day | 日時の日数 |
Series.dt.hour | 日時の時間 |
Series.dt.minute | 日時の分 |
Series.dt.second | 日時の秒数 |
Series.dt.microsecond | マイクロ秒 |
Series.dt.nanosecond | ナノ秒 |
Series.dt.week | 年の序数 |
Series.dt.weekofyear | 今年の序数 |
Series.dt.dayofweek | 月曜日= 0、日曜日= 6の曜日 |
Series.dt.weekday | Monday = 0、Sunday = 6の曜日 |
Series.dt.weekday_name | 週の名前(例:金曜日) |
Series.dt.dayofyear | 年の順番の日 |
Series.dt.quarter | 日付の四半期 |
Series.dt.is_month_start | 月の最初の日かどうかを示す論理値 |
Series.dt.is_month_end | 月の最終日 |
Series.dt.is_quarter_start | 四半期の初めの日かどうかを示す論理値 |
Series.dt.is_quarter_end | 四半期の最終日かどうかを示す論理値。 |
Series.dt.is_year_start | 年の最初の日かどうかを示す論理値。 |
Series.dt.is_year_end | 最後の年かどうかを示す論理値。 |
Series.dt.is_leap_year | 日付がうるう年に属するかどうかを示す論理的 |
Series.dt.daysinmonth | 月の日数 |
Series.dt.days_in_month | 今月の日数 |
公式ドキュメントはこちらpandas.pydata.org