はじめに

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.