【解説】日付要素の取り出し方法を学ぶ | データサイエンス100本ノック【問49〜問51 回答】
当ページのリンクには広告が含まれています。
目次
この記事の対象者
・ Pythonで日付要素の取り出し方を学びたい人
以降はデータサイエンス100本ノックの問題を題材に、日付要素の取り出し方法について学んでいきます。
データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。
第49問目: UNIX時間を日付型に変換し”年”だけ取り出す方法
P-049: レシート明細データフレーム(df_receipt)の売上エポック秒(sales_epoch)を日付型(timestamp型)に変換し、”年”だけ取り出してレシート番号(receipt_no)、レシートサブ番号(receipt_sub_no)とともに抽出せよ。データは10件を抽出すれば良い。
まずは、df_receipt
の構造を確認しましょう。
1 | df_receipt.head(5) |
1 | sales_ymd sales_epoch store_cd receipt_no receipt_sub_no customer_id product_cd quantity amount |
売上エポック秒(sales_epoch
)は、UNIX秒になっています。
UNIX秒とは、協定世界時(UTC)での1970年1月1日午前0時0分0秒からの秒数です。
このUNIX時間のままでは、日付や時間がわからないので、日付型に変換します。
日付型への変換はpandasのto_datetime()
関数を用います。
to_datetime()
関数では、引数でunit='s'
を指定することで、与えられたデータがUNIX時間とみなし変換を行います。
そして”年”の取り出しですが、dt.year
を用いることで抽出が可能です。
実際にコードを書いて確認してみましょう。
1 | tmp = pd.to_datetime(df_receipt['sales_epoch'], unit='s').dt.year |
1 | 0 2018 |
ご覧のように、sales_epoch
が日付型に変更され、”年”のみ抽出することが出来ました。
最後に抽出したtmp
データフレームに、receipt_no
とreceipt_sub_no
を結合して出力させます。
結合にはconcat
を使用すれば良いですね。
1 | df_tmp = pd.concat([df_receipt[['receipt_no', 'receipt_sub_no']], tmp], axis=1).head(10) |
1 |
|
本問はこれでOKです。
第50問目: UNIX時間を日付型に変換し”月”だけ取り出す方法
P-050: レシート明細データフレーム(df_receipt)の売上エポック秒(sales_epoch)を日付型(timestamp型)に変換し、”月”だけ取り出してレシート番号(receipt_no)、レシートサブ番号(receipt_sub_no)とともに抽出せよ。なお、”月”は0埋め2桁で取り出すこと。データは10件を抽出すれば良い。
第49問目の処理とほぼ同じですが、問題文にある“月”は0埋め2桁で取り出すことという部分に注意が必要です。
まずは第49問目と同様にUNIX時間を日付型に変換し、dt.month
を使って”月”のみを抽出してみましょう。
1 | tmp = pd.to_datetime(df_receipt['sales_epoch'], unit='s').dt.month |
1 | 0 11 |
出力結果を見てみると、0埋め2桁になっていません
実は0埋め2桁で取り出すためにはdt.strftime
を使う必要があります。引数として'%m'
を指定することで月を抽出することが出来ます。
1 | tmp = pd.to_datetime(df_receipt['sales_epoch'], unit='s').dt.strftime('%m') |
1 | 0 11 |
0埋め2桁で月を抽出することが出来ました。
最後にconcat
を使って結合しましょう。
1 | df_tmp = pd.concat([df_receipt[['receipt_no', 'receipt_sub_no']], tmp], axis=1).head(10) |
1 | receipt_no receipt_sub_no sales_epoch |
本問はこれで完了です。
第51問目: UNIX時間を日付型に変換し”日”だけ取り出す方法
P-051: レシート明細データフレーム(df_receipt)の売上エポック秒(sales_epoch)を日付型(timestamp型)に変換し、”日”だけ取り出してレシート番号(receipt_no)、レシートサブ番号(receipt_sub_no)とともに抽出せよ。なお、”日”は0埋め2桁で取り出すこと。データは10件を抽出すれば良い。
この問題は、第50問目の対応と同じになります。
第50問目と異なる点は、抽出する対象が月ではなく日になっている点です。
日を抽出するにはdt.strftime('%d')
を使えばOKです。
なお、dt.day
を用いると、第50問目で紹介したとき同様に、0埋め2桁ではない形式で抽出されてしまうので注意しましょう。
1 | tmp = pd.to_datetime(df_receipt['sales_epoch'], unit='s').dt.strftime('%d') |
1 | 0 03 |
同様にconcat
で結合します。
1 | df_tmp = pd.concat([df_receipt[['receipt_no', 'receipt_sub_no']], tmp], axis=1).head(10) |
1 | receipt_no receipt_sub_no sales_epoch |
まとめ: 日付要素の取り出し方法を学びました。
本記事は、「【Python】日付要素の取り出し方法を学ぶ | データサイエンス100本ノック【問49〜問51 回答】」というテーマでまとめました。
本記事で紹介した方法を元に、データサイエンティストとしての知見を深めていただければと思います。
なお、データサイエンティストに必要な知識は、TechAcademyのデータサイエンスコースでの学習がおすすめです。