【解説】日付要素の取り出し方法を学ぶ | データサイエンス100本ノック【問49〜問51 回答】

【解説】日付要素の取り出し方法を学ぶ | データサイエンス100本ノック【問49〜問51 回答】





目次

この記事の対象者



・ データサイエンティストを目指している人

・ Pythonで日付要素の取り出し方を学びたい人



以降はデータサイエンス100本ノックの問題を題材に、日付要素の取り出し方法について学んでいきます。


データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。


>>データサイエンス100本ノックの始め方を確認する


第49問目: UNIX時間を日付型に変換し”年”だけ取り出す方法

P-049: レシート明細データフレーム(df_receipt)の売上エポック秒(sales_epoch)を日付型(timestamp型)に変換し、”年”だけ取り出してレシート番号(receipt_no)、レシートサブ番号(receipt_sub_no)とともに抽出せよ。データは10件を抽出すれば良い。

まずは、df_receiptの構造を確認しましょう。

df_receiptの構造を確認
1
df_receipt.head(5)
出力
1
2
3
4
5
6
sales_ymd	sales_epoch	store_cd	receipt_no	receipt_sub_no	customer_id	product_cd	quantity	amount
0 20181103 1541203200 S14006 112 1 CS006214000001 P070305012 1 158
1 20181118 1542499200 S13008 1132 2 CS008415000097 P070701017 1 81
2 20170712 1499817600 S14028 1102 1 CS028414000014 P060101005 1 170
3 20190205 1549324800 S14042 1132 1 ZZ000000000000 P050301001 1 25
4 20180821 1534809600 S14025 1102 2 CS025415000050 P060102007 1 90

売上エポック秒(sales_epoch)は、UNIX秒になっています。

UNIX秒とは、協定世界時(UTC)での1970年1月1日午前0時0分0秒からの秒数です。

このUNIX時間のままでは、日付や時間がわからないので、日付型に変換します。

日付型への変換はpandasのto_datetime()関数を用います。

to_datetime()関数では、引数でunit='s'を指定することで、与えられたデータがUNIX時間とみなし変換を行います。

そして”年”の取り出しですが、dt.yearを用いることで抽出が可能です。

実際にコードを書いて確認してみましょう。

1
2
tmp = pd.to_datetime(df_receipt['sales_epoch'], unit='s').dt.year
tmp
出力
1
2
3
4
5
6
7
8
9
10
11
12
0         2018
1 2018
2 2017
3 2019
4 2018
...
104676 2018
104677 2019
104678 2017
104679 2017
104680 2019
Name: sales_epoch, Length: 104681, dtype: int64

ご覧のように、sales_epochが日付型に変更され、”年”のみ抽出することが出来ました。

最後に抽出したtmpデータフレームに、receipt_noreceipt_sub_noを結合して出力させます。

結合にはconcatを使用すれば良いですね。

>> concatの使い方を復習する

concatを用いて結合
1
2
df_tmp = pd.concat([df_receipt[['receipt_no', 'receipt_sub_no']], tmp], axis=1).head(10)
df_tmp
出力
1
2
3
4
5
6
7
8
9
10
11
12

receipt_no receipt_sub_no sales_epoch
0 112 1 2018
1 1132 2 2018
2 1102 1 2017
3 1132 1 2019
4 1102 2 2018
5 1112 1 2019
6 1102 2 2018
7 1102 1 2019
8 1112 2 2017
9 1102 1 2019

本問はこれで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
2
tmp = pd.to_datetime(df_receipt['sales_epoch'], unit='s').dt.month
tmp
出力
1
2
3
4
5
6
7
8
9
10
11
12
0         11
1 11
2 7
3 2
4 8
..
104676 2
104677 9
104678 3
104679 3
104680 4
Name: sales_epoch, Length: 104681, dtype: int64

出力結果を見てみると、0埋め2桁になっていません

実は0埋め2桁で取り出すためにはdt.strftimeを使う必要があります。引数として'%m'を指定することで月を抽出することが出来ます。

1
2
tmp = pd.to_datetime(df_receipt['sales_epoch'], unit='s').dt.strftime('%m')
tmp
出力
1
2
3
4
5
6
7
8
9
10
11
12
0         11
1 11
2 07
3 02
4 08
..
104676 02
104677 09
104678 03
104679 03
104680 04
Name: sales_epoch, Length: 104681, dtype: object

0埋め2桁で月を抽出することが出来ました。

最後にconcatを使って結合しましょう。

1
2
df_tmp = pd.concat([df_receipt[['receipt_no', 'receipt_sub_no']], tmp], axis=1).head(10)
df_tmp
出力
1
2
3
4
5
6
7
8
9
10
11
	receipt_no	receipt_sub_no	sales_epoch
0 112 1 11
1 1132 2 11
2 1102 1 07
3 1132 1 02
4 1102 2 08
5 1112 1 06
6 1102 2 12
7 1102 1 09
8 1112 2 05
9 1102 1 10

本問はこれで完了です。

第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
2
tmp = pd.to_datetime(df_receipt['sales_epoch'], unit='s').dt.strftime('%d')
tmp
出力
1
2
3
4
5
6
7
8
9
10
11
12
0         03
1 18
2 12
3 05
4 21
..
104676 21
104677 11
104678 11
104679 31
104680 23
Name: sales_epoch, Length: 104681, dtype: object

同様にconcatで結合します。

1
2
df_tmp = pd.concat([df_receipt[['receipt_no', 'receipt_sub_no']], tmp], axis=1).head(10)
df_tmp
出力
1
2
3
4
5
6
7
8
9
10
11
	receipt_no	receipt_sub_no	sales_epoch
0 112 1 03
1 1132 2 18
2 1102 1 12
3 1132 1 05
4 1102 2 21
5 1112 1 05
6 1102 2 05
7 1102 1 22
8 1112 2 04
9 1102 1 10


まとめ: 日付要素の取り出し方法を学びました。

本記事は、「【Python】日付要素の取り出し方法を学ぶ | データサイエンス100本ノック【問49〜問51 回答】」というテーマでまとめました。

本記事で紹介した方法を元に、データサイエンティストとしての知見を深めていただければと思います。

なお、データサイエンティストに必要な知識は、Udemyを活用した学習が効率的です。30日間の返金保証、および一流講師へのQ&Aシステムが整ったオンライン学習プラットフォームです。

世界で34万人が受講した以下の講座をご確認ください。

【世界で34万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜

コメント