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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python 3.x

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

868閲覧

繰り返し処理におけるif文について

yasuyyy

総合スコア13

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python 3.x

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/07/04 12:44

python

1data = { 2"日":[datetime.datetime(2018,4,20),datetime.datetime(2018,4,22),datetime.datetime(2018,5,26),datetime.datetime(2018,6,6)], 3"売り上げ":[5,6,7,8]} 4df = pd.DataFrame(data) 5 6week=[] 7a = datetime.datetime(2018,4,14) 8b = datetime.datetime(2018,4,20) 9for i in pd.to_datetime(df['日']): 10 i = i.to_pydatetime() 11 if a <= i <= b: 12 a = a.strftime("%Y/%m/%d") 13 b = b.strftime("%Y/%m/%d") 14 week.append(a+"ー"+b) 15 a = datetime.datetime.strptime(a,"%Y/%m/%d") 16 b = datetime.datetime.strptime(b,"%Y/%m/%d") 17 else: 18 a += datetime.timedelta(days=7) 19 b += datetime.timedelta(days=7) 20 21print(week) 22#出力:['2018/04/14ー2018/04/20']

本来実現したい出力は「日」の列の値全てに対応した週を出力することです。
現時点ですと初日の週しか出力できません。

なので繰り返し処理の中でelseを実行したあとにそのままif文の寸前まで戻る処理、または繰り返し処理の中でifの条件にあうまで繰り返す方法などご存知の方はいらっしゃいますでしょうか?
おそらくこのコードですとelse実行後にiに次の数字が代入されてしまうため思う結果になりません。

プログラミングの経験が浅いため、説明がわかりにくいと思いますが教えていただければ幸いです。よろしくお願いします。

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

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

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

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

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

mistn

2019/07/04 13:13

理想とする出力を追記してもらえませんか?
y_waiwai

2019/07/04 13:16

理想とする出力と、現状の出力を提示しましょう
yasuyyy

2019/07/04 13:25

['2018/04/14ー2018/04/20', '2018/04/21ー2018/04/27', '2018/05/26ー2018/06/01', '2018/06/02ー2018/06/08',] 上記が理想の出力になります。
yasuyyy

2019/07/04 13:25

['2018/04/14ー2018/04/20'] こちらが現状の出力になります。
guest

回答2

0

本来Pythonなどの言語に依存した問題ではなく、単にアルゴリズムの問題ですね。ロジックを言葉で表現できなければそれをプログラム言語に落とすことはできません。

さて、今回の場合、data(df)を中心にループしていますが、日付(a)を中心にループし、bを求め、aとbの範囲にあるdf中の日を算出してみました。

コードとしては以下のような感じです。特にweekに設定するコード入れていません。
動かして確認してみてください。

python

1last = datetime.datetime.now() 2a = datetime.datetime(2018,4,14) 3 4while a < last: 5 b = a+datetime.timedelta(days=6) 6 flg = df.query("@a<=日<=@b") 7 if len(flg.index)>0: 8 print(flg) 9 print("a: ", a) 10 print("b: ", b) 11 a += datetime.timedelta(days=7)

ただ、大元に実現したい何かを行うのに、本当にこれを算出することが
必要なのか疑問ですが。

投稿2019/07/04 14:26

t_obara

総合スコア5488

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

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

yasuyyy

2019/07/05 11:16

経験が浅く質問もわかりずらかったと思いますが回答ありがとうございました。こちらのコードを参考に勉強していきます。
guest

0

ベストアンサー

python

1import pandas as pd 2import datetime 3data = { 4"日":[datetime.datetime(2018,4,20),datetime.datetime(2018,4,22),datetime.datetime(2018,5,26),datetime.datetime(2018,6,6)], 5"売り上げ":[5,6,7,8]} 6df = pd.DataFrame(data) 7 8week=[] 9a = datetime.datetime(2018,4,14) 10b = datetime.datetime(2018,4,20) 11for i in pd.to_datetime(df['日']): 12 i = i.to_pydatetime() 13 14 while True: #ここ 15 if a <= i <= b: 16 a = a.strftime("%Y/%m/%d") 17 b = b.strftime("%Y/%m/%d") 18 week.append(a+"ー"+b) 19 a = datetime.datetime.strptime(a,"%Y/%m/%d") 20 b = datetime.datetime.strptime(b,"%Y/%m/%d") 21 break #ここ 22 else: 23 a += datetime.timedelta(days=7) 24 b += datetime.timedelta(days=7) 25 26print(week) 27# 出力:['2018/04/14ー2018/04/20', '2018/04/21ー2018/04/27', '2018/05/26ー2018/06/01', '2018/06/02ー2018/06/08']

もっと賢い方法はあると思いますがこんな感じですかね。while True:break を足しただけです。


賢そうな方法を思いついたので追記しておきます。
i(DataFrameの日付)からa(始まりの日付)を求め、aからb(終わりの日付)を求めるやり方です。

python

1import pandas as pd 2import datetime 3data = { 4 "日":[datetime.datetime(2018,4,20),datetime.datetime(2018,4,22),datetime.datetime(2018,5,26),datetime.datetime(2018,6,6)], 5 "売り上げ":[5,6,7,8] 6} 7df = pd.DataFrame(data) 8 9week=[] 10a = datetime.datetime(2018,4,14) 11for i in pd.to_datetime(df['日']): 12 i = i.to_pydatetime() 13 day = (i-a).days 14 a = a + datetime.timedelta(days=day - (day % 7)) 15 b = a + datetime.timedelta(days=6) 16 17 start = a.strftime("%Y/%m/%d") 18 end = b.strftime("%Y/%m/%d") 19 week.append(start+"ー"+end) 20 21print(week)

投稿2019/07/04 14:11

編集2019/07/05 01:33
mistn

総合スコア1191

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

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

yasuyyy

2019/07/05 11:16

こちらのコードで無事動きました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問