LoginSignup
1
1

More than 1 year has passed since last update.

pandasで日時を増減する。

Last updated at Posted at 2022-11-25

はじめに

データサイエンス100本ノック(構造化データ加工編) - Python

P-074: レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、当該週の月曜日からの経過日数を計算し、売上日、当該週の月曜日付とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値でデータを保持している点に注意)。

において、模範解答は

を使用している。

pandasにも時間用の関数はあるはずなのでやってみました。

コード例

A-074
df_receipt[['customer_id','sales_ymd']].assign(
    sales_ymd = pd.to_datetime(df_receipt.sales_ymd.astype('str')),
    sales_weekday = lambda x: x.sales_ymd.dt.day_name(),
    day_ofmonday = lambda x: x.sales_ymd.dt.dayofweek.map(lambda s: pd.Timedelta(days=s)),
    monday=lambda x: x.sales_ymd - x.day_ofmonday
)

customer_id sales_ymd sales_weekday day_ofmonday monday
0 CS006214000001 2018-11-03 Saturday 5 days 2018-10-29
1 CS008415000097 2018-11-18 Sunday 6 days 2018-11-12
2 CS028414000014 2017-07-12 Wednesday 2 days 2017-07-10
3 ZZ000000000000 2019-02-05 Tuesday 1 days 2019-02-04
4 CS025415000050 2018-08-21 Tuesday 1 days 2018-08-20
... ... ... ... ... ...
104676 ZZ000000000000 2018-02-21 Wednesday 2 days 2018-02-19
104677 ZZ000000000000 2019-09-11 Wednesday 2 days 2019-09-09
104678 CS040513000195 2017-03-11 Saturday 5 days 2017-03-06
104679 CS002513000049 2017-03-31 Friday 4 days 2017-03-27
104680 ZZ000000000000 2019-04-23 Tuesday 1 days 2019-04-22

104681 rows × 5 columns

解説

を見てみると、Timedeltaが使えそう。

いろいろ試してみると、pandas.Series.mappandas.Timedeltaをつくってあげると、そのまま足し算引き算できそう。

引数に指定するので、関数を作ってあげて、順番に列を作成していった。

最初はDataFrame.applyDateOffsetでやってみたけど、遅かったり、戻り値の形が違ってしまったので、今の形に落ち着いた。

まとめ

pandas.Series.mapの使い方がまだまだですので、練習。練習。

1
1
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
1
1