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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

489閲覧

日付の照合後に週番号の割り当てをしたい

mom_mom

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/11/01 05:21

前提

Pythonです。
データセットに日付項目(YYYY-MM-DD)があります。

実現したいこと

データセットの日付とpd.date_range('2021-09-01', '2022-08-31', freq='1d')で発生させた日付が等しいときに、該当日付の週番号を付与したいです。

発生している問題・エラーメッセージ

しかし、if文の条件文が正しく評価されていないようで、うまく週番号を割り当てられません。
どこかで勘違いしてしまっているのでしょうか?

該当のソースコード

Python

1def special_calendar(year, month, day): 2 inp = datetime.date(year=year, month=month, day=day) 3 first = datetime.date(year=year, month=1, day=1) 4 5 #曜日の計算 6 inp_how = (inp.weekday()+1) % 7 #+4は曜日を木曜始まりに変更するため 7 first_how = (first.weekday()+4) % 7 8 9 #週番号の計算 10 #カレンダーの左上(最初の日曜日)の日付を取得 11 upper_left = first - datetime.timedelta(days=first_how) 12 13 #基準日との日数差を計算して週番号を取得 14 inp_week = (inp - upper_left).days // 7 15 16 return inp_week 17 18 19for d in pd.date_range('2021-09-01', '2022-08-31', freq='1d'): 20 if df_actual_all['date'].any() == pd.to_datetime(d.date()).date: 21 df_actual_all['week'] = special_calendar(year=d.date().year, month=d.date().month, day=d.date().day) 22 else: 23 df_actual_all['week'] = 99

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

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

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

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

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

guest

回答2

0

ベストアンサー

提示コードでは条件に一致する行を抽出できていません。
以下のようなコードで行を抽出し、値をセットすることができます。
なお、週番号の処理についての正当性は確認していません。
もしこの処理も意図通りでなければPythonでいろいろな週始まりのウィークナンバー(週番号)を取得してみるが参考になるかと思います。

Python

1import datetime 2import pandas as pd 3 4def special_calendar(year, month, day): 5 inp = datetime.date(year=year, month=month, day=day) 6 first = datetime.date(year=year, month=1, day=1) 7 8 #曜日の計算 9 inp_how = (inp.weekday()+1) % 7 #+4は曜日を木曜始まりに変更するため 10 first_how = (first.weekday()+4) % 7 11 12 #週番号の計算 13 #カレンダーの左上(最初の日曜日)の日付を取得 14 upper_left = first - datetime.timedelta(days=first_how) 15 16 #基準日との日数差を計算して週番号を取得 17 inp_week = (inp - upper_left).days // 7 18 19 return inp_week 20 21 22df_actual_all = pd.DataFrame({'date':['2021-09-01','2021-09-01','2021-09-02','2021-09-03']}) 23df_actual_all['date'] = pd.to_datetime(df_actual_all['date']) 24df_actual_all['week'] = 99 25 26for d in pd.date_range('2021-09-01', '2021-09-04', freq='1d'): 27 week_no = special_calendar(year=d.date().year, month=d.date().month, day=d.date().day) 28 filter = df_actual_all['date'] == d 29 df_actual_all.loc[filter,'week'] = week_no 30 31print(df_actual_all) 32""" 33 date week 340 2021-09-01 34 351 2021-09-01 34 362 2021-09-02 35 373 2021-09-03 35 38"""

投稿2022/11/01 07:45

can110

総合スコア38233

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

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

mom_mom

2022/11/02 05:04

ご指摘通りでした。 ありがとうございました! ちなみに、週番号の処理については誤りはございませんでした。
guest

0

inp_week = (inp - upper_left).days // 7floor(inp_week = (inp - upper_left).days / 7)

投稿2022/11/01 05:45

atcoderyellow

総合スコア481

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問