
例えば、以下のように時間データがあるとします。データは、時系列順に並んでると限りません。
必ず、左がFrom時間、右がTo時間は成立します。
1 7:00~8:00
2 7:30~9:00
3 10:15~10:45
4 10:00~11:00
5 14:00~15:00
6 16:30~17:00
7 13:00~16:00
重複している時間を下記のように除去したいです。どのように時間を取得しても取得しても問題ありません。
ロジック的に可能でしょうか。
回答1例
1 7:00~9:00
2 10:00~11:00
3 13:00~17:00
回答2例
1 7:00~7:30
2 7:30~8:00
3 8:00~9:00
.
.
などなど
私が考えたロジックだと、下記のようにやってみましたがうまく動くと思いますか。
パターンの洗い出しができているかわからなくなってきました。
ほかに良い方法、スマートな方法などありますか。
1 7:00~8:00
2 7:30~9:00
3 10:15~10:45
4 10:00~11:00
5 14:00~15:00
6 16:30~17:00
7 13:00~16:00
8 6:00~7:30
①From時間を昇順に並べる
②先頭を基準とする。次のデータを対象データとする。
③対象のTo時間が基準データFrom時間より前の場合は変更しない。
④対象のFrom時間が基準データTo時間より後の場合は変更しない。
⓺対象のFrom時間が基準データFrom時間より後、かつ、
対象のTo時間が基準データTo時間より後 の場合は、対象のFrom時間を基準のTo時間にする。
⑦対象のFrom時間が基準データFrom時間より後、かつ、
対象のTo時間が基準データTo時間より前 の場合は、対象のデータを消す。
⑨対象のFrom時間が基準データFrom時間より前、かつ、
対象のTo時間が基準データTo時間より後 の場合は、基準のデータを消し、対象のデータを基準とする。
⑧②~⑦の処理で下まで処理する。
(おそらく)処理結果
8 6:00~7:30
1 7:30~8:00
2 8:00~9:00
4 10:00~11:00
7 13:00~16:00
6 16:00~17:00
No.7ベストアンサー
- 回答日時:
python3のコーディング例を下記にアップしました。
このサイトは投稿時インデントが崩れるので、下記にアップしてます。
https://ideone.com/3J1xJC
実行結果
202201230600 ~ 202201230900
202201231000 ~ 202201231100
202201231300 ~ 202201231600
202201231630 ~ 202201231700
コーディング方法まで修正いただきありがとうございます。
すごくシンプルで、問題解決できそうですね。
0~bxまでが取得したい値ということを理解しきれていませんでしたが、サンプルコードを見てわかりました。
ありがとうございます
No.5
- 回答日時:
>#データ[i]のFrom時間>基準データのTo時間の場合、このデータをbx+1へ登録する。
こちらの意味を理解しきれずにサンプルを作ったのですが、どのデータに登録すればよいのでしょうか下記の意味であっています。
dataInfos[bx+1]=dataInfos[i]
なにか、C#でなくpythonのような気がするのですが、気のせいでしょうか。
回答ありがとうございます。
スクリプトはpythonで記述しています。
C#でこちらのコードは実装予定ですが、tatsumaru77さんが回答いただいたロジックをいったんpythonで作成してみました。
こちらのコードを実行すると下記のようになり、思ったような値を取得できないのですが、処理が抜けてしまっているのでしょうか。
実行結果
From:202201230600 To:202201230900
From:202201231000 To:202201231100
From:202201231015 To:202201231045
From:202201231300 To:202201231600
From:202201231400 To:202201231500
From:202201231630 To:202201231700
From:202201231400 To:202201231500
From:202201231630 To:202201231700
No.4
- 回答日時:
そもそもデータはどういう状態なの?
CSVなどのファイル?
DataTable等の変数内?
データグリッドビュー?
とは言え初心者だけどね。
No.3
- 回答日時:
コーディングイメージとしては、以下のようになります。
N件のデータがあるとします。(N>1)
①From時間で昇順に並べる。
②基準データの添え字をbxとする。
最初はbx=0とする。
③i = 1からN-1まで繰り返す。(④~⑥の繰り返し)
④データ[i]のFrom時間>基準データのTo時間の場合、
このデータをbx+1へ登録する。(bx+1==iの場合は同じ位置になるので登録不要)
bxに1加算。
次の要素の繰り返しへ(continue)
⑤データ[i]のTo時間>基準データのTo時間の場合、
基準データのTo時間へデータ[i]のTo時間を設定
次の要素の繰り返しへ
⑥残ったケースは削除対象のデータなので処理不要(次の要素の繰り返しへ)
⑦0~bxまでのデータを印字する。(求める結果)
詳しく説明いただきありがとうございます。
正直、落とし込めれていないので、いったんtatsumaru77様が、
回答していただいたプログラムをpythonでサンプルに落とし込んでみます。
No.2
- 回答日時:
C#の環境がないので、コメントだけになります。
③このケースはあり得ないので考慮不要です。
(From時間で昇順に並んでいることが前提なので。)
FromがToより大きいケースはないものとします。
④これでOKですが、これは、そのまま、登録されるので、次のデータを
処理するときは、このデータが、基準データになります。
⑥対象のFrom時間は考量不要です。(From時間で昇順に並んでいることが前提なので。)
この場合、基準と対象を1つにまとめるので、
⑥-1 基準のTo時間へ対象のTo時間を設定する。
⑥-2 対象を削除する。
になります。
⑦OKですが、対象のFrom時間は考量不要です。(⑥と同様)
⑨このケースはあり得ません。(③と同様)
⑧次のデータを処理するときは、常に、登録済みの最後のデータを基準データとして扱うようにしてください。
データを登録する場合は、前詰で登録するようにしてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
ジャバスクリプトでのことですが(初心者なのでできるだけ専門用語は少なくしていたらければうれしいです)
その他(プログラミング・Web制作)
-
誰か助けてください。 私はプログラミングに興味がないのにそういう大学に入学しました。 当然、目的もな
その他(プログラミング・Web制作)
-
エクセル以外で麻雀の成績を管理する方法(プログラミングでやりたい)
その他(プログラミング・Web制作)
-
4
プログラミングについて質問があり投稿させていただきました。 現在考えているのが0~4秒の間はAの作業
その他(プログラミング・Web制作)
-
5
このエラーの治し方を知りたいです。
その他(プログラミング・Web制作)
-
6
try~catchを使用した時、戻り値を記述場所はどこが良いのですか?
C言語・C++・C#
-
7
プログラム
その他(プログラミング・Web制作)
-
8
たとえば、s = Tokyo Kyoto という文字列で s2 = s.split() しますと、s
C言語・C++・C#
-
9
複数のcsvをVBAでマージする方法をご教示ください!
Visual Basic(VBA)
-
10
Microsoft Visual Studio Code 使用不可!・・・を覆せる?
その他(プログラミング・Web制作)
-
11
プログラム作成教えてください。大至急
C言語・C++・C#
-
12
パイソンについて。for文の変数は、for文ごとに使い分ける、が無難ですか?たとえば、 for x
C言語・C++・C#
-
13
プログラミングって数学使うんですか? 英語はできますが...数学はできないです
その他(プログラミング・Web制作)
-
14
プログラミングの問題です。
その他(プログラミング・Web制作)
-
15
【至急!!!】c言語のプログラムを書いて実行しようとすると、英語で「プログラムがリソースを消費しすぎ
C言語・C++・C#
-
16
パイソンを使ってエクセルで作った各会社ごとの売り上げを一つのエクセルにまとめる
その他(プログラミング・Web制作)
-
17
プログラミング
C言語・C++・C#
-
18
正規表現に当てはまる文字列を教えてください。 下記の正規表現に当てはまる文字列を何でも良いので例をい
その他(プログラミング・Web制作)
-
19
指定した時間に指定したプログラムを動かしてくれるCRONというプログラム?はwebサイトなどを運営す
その他(プログラミング・Web制作)
-
20
VBAプログラミング
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
ブレーカー落ちで壊れたりしな...
-
5
C言語のバイナリファイルに関す...
-
6
阿武町4630万円誤送金事件。町...
-
7
COBOL数値転記をCOPY句内での仕様
-
8
C# ソケット通信でデータ受信時...
-
9
VB6のListの使い方
-
10
シーケンサにパソコンからアク...
-
11
curlのオプション
-
12
ハミング窓関数とFFT(高速フー...
-
13
二分探索の平均探索回数
-
14
エクセルで2つの時系列のデー...
-
15
S9タイプからXタイプにデータ...
-
16
マクロ初心者です、エクセルで...
-
17
Excel vbaで、一行ずつコピーし...
-
18
Excelが取り込めるのは何行まで...
-
19
0が含まれる幾何平均が「#NUM!」
-
20
VBAでシートからコンボボックス...
おすすめ情報
公式facebook
公式twitter
from datetime import datetime as dt
class TimeInfo:
def __init__(self,From,To):
self.From= From
self.To = To
dataInfos=[]
dataInfos.append(TimeInfo(202201230700, 202201230800))
dataInfos.append(TimeInfo(202201230730, 202201230900))
dataInfos.append(TimeInfo(202201231015, 202201231045))
dataInfos.append(TimeInfo(202201231000, 202201231100))
dataInfos.append(TimeInfo(202201231400, 202201231500))
dataInfos.append(TimeInfo(202201231630, 202201231700))
dataInfos.append(TimeInfo(202201231300, 202201231600))
dataInfos.append(TimeInfo(202201230600, 202201230730))
dataInfos= sorted(dataInfos, key=lambda datetime: datetime.From) #①From時間で昇順に並べる。
bx=0 #基準データの添え字をbxとする。最初はbx=0とする。
kijunData=dataInfos[bx]
for i in range(1,len(dataInfos)): #i = 1からN-1まで繰り返す。(④~⑥の繰り返し)
if dataInfos[i].From > kijunData.To: #データ[i]のFrom時間>基準データのTo時間の場合、このデータをbx+1へ登録する。
dataInfos[bx+1]=dataInfos[i]
bx=bx+1 #bxに1加算。
elif dataInfos[i].To>kijunData.To: #データ[i]のTo時間>基準データのTo時間の場合、
#基準データのTo時間へデータ[i]のTo時間を設定 次の要素の繰り返しへ
kijunData.To=dataInfos[i].To
#データ[i]のFrom時間>基準データのTo時間の場合、このデータをbx+1へ登録する。
こちらの意味を理解しきれずにサンプルを作ったのですが、どのデータに登録すればよいのでしょうか