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

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

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

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

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回答

1721閲覧

pythonで週単位、月単位の指定期間内に出現した数をカウントする方法を教えてください!

taiki9121

総合スコア18

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Python 3.x

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

Python

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

pandas

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

0グッド

0クリップ

投稿2020/09/22 07:47

編集2020/09/22 08:06

下記は入力部であるdatesが与えられたとき、to_period()を用いて週単位、月単位の期間指定の範囲で出現数をカウントします。

# dates 0 2020-01-07 12:03:24+00:00 1 2020-01-10 06:50:11+00:00 2 2020-01-14 12:09:12+00:00 3 2020-01-21 11:32:37+00:00 4 2020-02-05 13:04:53+00:00 5 2020-02-15 12:36:20+00:00 6 2020-03-05 12:45:47+00:00 7 2020-03-28 04:28:11+00:00 8 2020-04-14 11:15:31+00:00 9 2020-04-25 13:12:17+00:00
def count_period(dates): dates = pd.Series(index=dates) months = dates.to_period("M").index months = months.value_counts().sort_index() weeks = dates.to_period("W").index weeks = weeks.value_counts().sort_index() return weeks, months (weeks, months) = count_period(dates) print(weeks) print(months) #weeks 2020-01-06/2020-01-12 2 2020-01-13/2020-01-19 1 2020-01-20/2020-01-26 1 2020-02-03/2020-02-09 1 2020-02-10/2020-02-16 1 2020-03-02/2020-03-08 1 2020-03-23/2020-03-29 1 2020-04-13/2020-04-19 1 2020-04-20/2020-04-26 1 #months 2020-01 4 2020-02 2 2020-03 2 2020-04 2

しかし、この実装ですと、2020-01-272020-02-02や2020-02-172020-03-01などでカウント数:0の情報が抜けてしまいます。
また、日付が2020-04-20/2020-04-26までで止まっており、それ以降~現在(先週の日曜)までの週単位、月単位の情報(カウント数:0)が漏れないようにしたいです。

最終的には下記のような結果を望みます。

#weeks 2020-01-06/2020-01-12 2 2020-01-13/2020-01-19 1 2020-01-20/2020-01-26 1 2020-01-27/2020-02-02 0 2020-02-03/2020-02-09 1 2020-02-10/2020-02-16 1 2020-02-17/2020-02-23 0 2020-02-24/2020-03-01 0 2020-03-02/2020-03-08 1 2020-03-09/2020-03-15 0 2020-03-16/2020-03-22 0 ・・・ 2020-08-31/2020-09-06 0 2020-09-07/2020-09-13 0 #months 2020-01 4 2020-02 2 2020-03 2 2020-04 2 2020-05 0 2020-06 0 2020-07 0 2020-08 0

ご教授お待ちしております!

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

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

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

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

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

guest

回答2

0

ベストアンサー

ほとんどできているので、最後に追加でreindexしてやれば希望のデータが得られます。

python

1today = pd.Timestamp.now() 2weeks = weeks.reindex( 3 pd.period_range(weeks.index[0], today, freq=weeks.index.freq), 4 fill_value=0) 5months = months.reindex( 6 pd.period_range(months.index[0], today, freq=months.index.freq), 7 fill_value=0)

投稿2020/09/22 12:34

bsdfan

総合スコア4794

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

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

taiki9121

2020/09/22 14:09

ありがとうございます! 助かりました
guest

0

以下のようにヒストグラムを作成する問題として考えればよいと思います。

  1. 一番最初の日付の週の最初の日を取得する。
  2. 一番最後の日付の週の最後の日を取得する
  3. pd.date_range() でその範囲で1周間ごとでビンを作成する。
  4. pd.cut() でビン分割処理する。

python

1import pandas as pd 2 3dates = pd.to_datetime( 4 [ 5 "2020-01-07 12:03:24+00:00", 6 "2020-01-10 06:50:11+00:00", 7 "2020-01-14 12:09:12+00:00", 8 "2020-01-21 11:32:37+00:00", 9 "2020-02-05 13:04:53+00:00", 10 "2020-02-15 12:36:20+00:00", 11 "2020-03-05 12:45:47+00:00", 12 "2020-03-28 04:28:11+00:00", 13 "2020-04-14 11:15:31+00:00", 14 "2020-04-25 13:12:17+00:00", 15 ] 16) 17 18 19def count(dates): 20 first = dates.sort_values()[0] # 最初の日 21 last = pd.Timestamp.now(dates.tz) # 同じタイムゾーンで今日の日付取得 22 23 # 日付 - 週の最初から数えた日数 = 週の最初の日 (月曜=0の場合) 24 begin = first - pd.to_timedelta(first.dayofweek, unit="d") 25 # 一番最後の日付の週の最後の日を取得する。 26 end = last + (pd.to_timedelta("6days") - pd.to_timedelta(last.dayofweek, unit="d")) 27 # ビンを作成 28 weeks = pd.date_range(begin.floor("D"), end.floor("D"), freq="W-MON") 29 # ビン分割処理 30 ret = pd.cut(dates, weeks, right=False, include_lowest=False) 31 32 return ret.value_counts() 33 34 35ret = count(dates) 36print(ret)
[2020-01-06, 2020-01-13) 2 [2020-01-13, 2020-01-20) 1 [2020-01-20, 2020-01-27) 1 [2020-01-27, 2020-02-03) 0 [2020-02-03, 2020-02-10) 1 [2020-02-10, 2020-02-17) 1 [2020-02-17, 2020-02-24) 0 [2020-02-24, 2020-03-02) 0 [2020-03-02, 2020-03-09) 1 [2020-03-09, 2020-03-16) 0 [2020-03-16, 2020-03-23) 0 [2020-03-23, 2020-03-30) 1 [2020-03-30, 2020-04-06) 0 [2020-04-06, 2020-04-13) 0 [2020-04-13, 2020-04-20) 1 [2020-04-20, 2020-04-27) 1 [2020-04-27, 2020-05-04) 0 [2020-05-04, 2020-05-11) 0 [2020-05-11, 2020-05-18) 0 [2020-05-18, 2020-05-25) 0 [2020-05-25, 2020-06-01) 0 [2020-06-01, 2020-06-08) 0 [2020-06-08, 2020-06-15) 0 [2020-06-15, 2020-06-22) 0 [2020-06-22, 2020-06-29) 0 [2020-06-29, 2020-07-06) 0 [2020-07-06, 2020-07-13) 0 [2020-07-13, 2020-07-20) 0 [2020-07-20, 2020-07-27) 0 [2020-07-27, 2020-08-03) 0 [2020-08-03, 2020-08-10) 0 [2020-08-10, 2020-08-17) 0 [2020-08-17, 2020-08-24) 0 [2020-08-24, 2020-08-31) 0 [2020-08-31, 2020-09-07) 0 [2020-09-07, 2020-09-14) 0 [2020-09-14, 2020-09-21) 0 dtype: int64

※ [2020-09-07, 2020-09-14) の場合、左半開区間なので、2020-09-07, 2020-09-13 を意味します。

pandas - 日時や期間の情報を取得する dt accessor の使い方
pandas - cut、qcut でビン分割を行う方法

投稿2020/09/22 08:39

編集2020/09/22 08:46
tiitoi

総合スコア21956

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

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

taiki9121

2020/09/22 14:09

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問