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

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

ただいまの
回答率

88.77%

時間範囲の重複カウントにつて

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 838

konda

score 24

時間範囲が被っていれば、被っている数の分カウントするプログラムを作ろうと思っています。
時刻のデータは以下の様な.txtで保存してあります。(各行での左時刻が開始時刻、右軸が終了時刻)

11:00 12:00
13:00 14:00
11:20 11:50
12:30 14:00
10:20 11:30
13:10 13:30

10:20-10:59 はカウント数1,11:00-11-20まではカウント数が3と出力されるプログラムを考えています。
同じ文字が被っていた場合のカウント方法はわかるのですが時刻範囲のカウント方法のイメージが湧かなくて詰まっています。。。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • LouiS0616

    2019/05/11 10:43

    『11:00-11-20まではカウント数が3』というのが良く分からないです。
    これは 11:20 11:50 が 11:00-11-20 の範囲に被っている扱いだと言うことでしょうか?

    キャンセル

  • konda

    2019/05/11 10:49

    説明不足で申し訳ありません。
    上の3つの時間のデータはdata1.txt dta2.txt data3.txtで別々に保存しており、11:00-11:20の時間帯に被っているのは、3つのデータすべてに被っているので出力結果を3にしたいということです。

    キャンセル

回答 2

+1

datetimeモジュールの日付型は比較できるので以下のように書けば簡単だと思います。

from datetime import datetime

def main():
    # 文字列の時間を日付型に変換
    a = datetime.strptime('10:20', '%H:%M')
    b = datetime.strptime('10:59', '%H:%M')

    time = datetime.strptime('11:00', '%H:%M')

    if a <= time <= b:
        print('時間内')
    else:
        print('時間外')

if __name__ == "__main__":
    main()

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/11 10:19

    回答ありがとうございます。
    この場合だと、.txtファイルを読み込むプログラムを書いた後、以上のプログラムをカウントするプログラムに変更して書けばよいということで大丈夫でしょうか?

    キャンセル

  • 2019/05/11 10:41

    そうです。回答にあるプログラムは例なので自分のやりたいことに合うように変更してください。

    キャンセル

  • 2019/05/11 10:50

    ありがとうございます。実際にやってみます。

    キャンセル

0

datetime モジュールに timedelta という datetime 型の差分を保持する型があります。時刻を datetime 型で持ち、差分が2つの時刻の差分の範囲内にあるかを検査すればよいのではないでしょうか。こんな感じで:

import datetime

def main():
    today = datetime.datetime.today()
    timelist = [
            (datetime.datetime(today.year, today.month, today.day, 11, 0),
                datetime.datetime(today.year, today.month, today.day, 12, 0)),
            (datetime.datetime(today.year, today.month, today.day, 11, 30),
                datetime.datetime(today.year, today.month, today.day, 12, 30))
            ]
    t = datetime.datetime.now()
    count = 0
    for tpair in timelist:
        maxspan = tpair[1] - tpair[0]
        span = t - tpair[0]
        if span.days >= 0 and span.seconds < maxspan.seconds:
            count += 1
    print(str(count))

if __name__ == '__main__':
  main()
  • 時刻1以降かどうかの検査は、(時刻t - 時刻1) の timedelta が0以上か(時刻1より前の場合 timedelta.days がマイナスになる)で見て
  • 時刻2よりも前かどうかは時刻1を引いた timedelta の秒数が (時刻2-時刻1)の秒数より小さいかどうかで判別しています。

エレガントではないなあと思うのですが、とっさに思いついたのはこんなところです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る