質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

974閲覧

python 月の最後の平日を新しい列としてデータフレームに追加したい。

yuudai

総合スコア65

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/11/09 09:50

前提・実現したいこと

イメージ説明
1時間ごとの値が入ったデータフレームがあり、列Dayをshift(24)した値が1ならその行は月末の平日だとわかると思い、月末なら1そうでないなら0という列を作るために

df['EOM'] = 1 if df['Day'].shift(24) == 1 else 0

このように書いたのですが

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

このようなエラーが出ました。
しかしこのデータフレームはぬけている行があるのでそのすべての行に対してshiftをできたとしても途中でずれることに気づきました。どのようにすればその行が月の最後の平日だと判別できますか?よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2020/11/09 12:39

「平日」の定義は? 単に「日曜日以外の曜日」でいいのかな?
guest

回答1

0

ベストアンサー

どのようにすればその行が月の最後の平日だと判別できますか?

まず、対象の年月から月末日を求めてそれと一致するかを判定します。
そのあとに土日祝日かを判定すればよさそうです。
祝日かの判定はJPHolidayを利用しています。
参考:datetimeとjpholidayを組み合わせて、平日か土日祝日かを判定するスクリプト

Python

1import pandas as pd 2import jpholiday 3import datetime 4import calendar 5 6df = pd.DataFrame({'Time':['2018-02-02 05:00:00', '2018-02-28 05:00:00','2018-03-31 05:00:00','2018-04-30 05:00:00','2018-12-31 05:00:00']}) 7df['Time'] = pd.to_datetime(df['Time']) 8df['Weekdays'] = df['Time'].dt.strftime('%A') 9 10def is_last_weekday(dt): 11 d_cur = dt.date() 12 13 y,m = d_cur.year,d_cur.month 14 ym = calendar.monthrange(y, m) 15 d_last = datetime.date(y, m, ym[1]) # 月末 16 17 # 月末? 18 if d_cur != d_last: 19 return 0 20 21 # 土日祝日? 22 if d_cur.weekday() >= 5 or jpholiday.is_holiday(d_cur): 23 print(d_cur, jpholiday.is_holiday_name(d_cur)) 24 return 0 25 26 # 平日 27 return 1 28 29df['EOM'] = df['Time'].apply(is_last_weekday) 30print(df) 31""" 32 Time Weekdays EOM 330 2018-02-02 05:00:00 Friday 0 341 2018-02-28 05:00:00 Wednesday 1 352 2018-03-31 05:00:00 Saturday 0 363 2018-04-30 05:00:00 Monday 0 374 2018-12-31 05:00:00 Monday 1 38"""

投稿2020/11/10 01:16

編集2020/11/10 22:50
can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuudai

2020/11/10 15:21

実行するとこのようなエラーが出ました。 ----> 5 d_last = datetime.date(d_cur.year, d_cur.month+1, 1) - datetime.timedelta(days=1) ValueError: month must be in 1..12 d_cur.month+1この部分が13月を表示してしまっているとかですかね?
can110

2020/11/10 22:51

ですね。月末を求める部分を修正しました。
yuudai

2020/11/11 06:50

ありがとうございます!無事解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問