LoginSignup
92
95

More than 5 years have passed since last update.

PandasでSeries.dt()を使って日付を変換する方法

Last updated at Posted at 2018-04-17

はじめに

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

92
95
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
92
95