-
Python Pandas入門:特定の時系列頻度でDateTimeIndexから時間(hour)を抽出する方法
特定の時系列頻度を持つ DateTimeIndex から時間(hour)を抽出したい場合は、DateTimeIndex.hour プロパティを使用します。このプロパティを使うことで、日時インデックスに含まれる各タイムスタンプの「時」の部分だけを簡単に取り出すことができます。必要なライブラリのインポートまず、必要なライブラリをインポートしましょう。import pandas as pdDateTimeIndexの作成次に、開始時刻「2021-10-20 02:35:55」から始まる、期間6・頻度「H」(時間単位)の DatetimeIndex を作成します。タイムゾーンはオーストラリアのシドニー
-
Pythonで他の区間に完全に含まれる区間の個数をカウントする方法
問題概要区間のリストが与えられます。リスト内の各 interval[i] は [start, end](開始値と終了値)を持ちます。この中から、「別の区間に完全に含まれている」区間の個数を求めます。ただし、ある区間が複数の他の区間に含まれている場合でも、1つとしてのみカウントします。区間 [s0, e0] が別の区間 [s1, e1] の内側にあるとは、s0 ≥ s1 かつ e0 ≤ e1 が成り立つことを指します。例として、intervals = [[2, 6], [3, 4], [4, 7], [5, 5]] が入力された場合、出力は 2 になります。[3, 4] は [2, 6] に、[
-
Pythonで与えられたバイナリ行列の正方形部分行列の数を数えるプログラム
問題概要2次元のバイナリ行列(0と1だけで構成された行列)が与えられたとき、すべての要素が1で構成されている正方形部分行列の総数を求めることを考えます。例えば、次のような入力が与えられたとします。011011この場合の出力は 5 になります。これは、(2 × 2) の正方形が1つと、(1 × 1) の正方形が4つ存在するためです。解法のアプローチ(動的計画法)この問題は動的計画法(DP)を使うことで効率的に解けます。基本的な考え方は、「各セルを右下の角とする最大の正方形の一辺の長さ」を行列に順番に記録していくというものです。あるセルが1であれば、その左・上・左上のセルの値の最小値に1を足したも
-
【Python】バイナリ文字列に含まれる「1」のみの部分文字列を数えるアルゴリズム
バイナリ文字列 s が与えられたとき、「1」だけで構成される部分文字列(substring)の総数を求める問題を考えてみましょう。答えが非常に大きくなる可能性がある場合は、結果を 109+7 で割った余りを返します。問題の例たとえば、入力が s = 100111 の場合を考えます。このとき出力は 7 になります。なぜなら、「1」のみを含む部分文字列は次の 7 つだからです。「1」 × 4つ(各位置にある単独の1)「11」 × 2つ「111」 × 1つ解法のアプローチこの問題は、文字列を左から右へ一度走査するだけで解くことができます。ポイントは、「現在位置で終わる『1』のみの部分文字列の数」を累
-
与えられた操作でリストを減らしながら、Pythonで残る最小の数を求めるプログラム
問題の概要正の整数からなるリスト nums が与えられます。ここで、次のような操作を考えます。リストから任意の2つの値 a と b(a ≤ b)を取り除くa < b が成り立つ場合、その差 b − a をリストへ挿し戻すこの操作は何回でも実行できます。最終的にリストに残せる最小の数を求めてください。なお、リストが空になった場合は 0 を返します。入出力例たとえば nums = [2, 4, 5] の場合、答えは 1 になります。まず 4 と 5 を選んで差の 1 を戻せばリストは [2, 1] となり、続いて 2 と 1 を選べば [1] だけが残ります。解き方のアプローチこの問題は、各
-
Pythonで同じ長さのリボンをk本切り出せる最大の長さを求めるプログラム
正の整数のリスト(各リボンの長さを表します)と整数 k が与えられます。リボンは何回でも切ることができるので、長さ r のリボンをちょうど k 本作れるような最大の r を求めてください。そのような解が存在しない場合は -1 を返します。たとえば、入力が ribbons = [1, 2, 5, 7, 15]、k = 5 の場合、出力は 5 になります。長さ 15 のリボンを長さ 5 の 3 本に切り分け、長さ 7 のリボンは長さ 2 と 5 に切り分けます。さらに長さ 5 のリボンがもう 1 本あるため、合計で長さ 5 のリボンが 5 本手に入ります。解法のアプローチ:二分探索この問題は二分探
-
【Python】ロッドを切断して同じ長さで販売したときの最大利益を求めるプログラム
ロッドの長さを格納したリスト rodLen があるとします。さらに、単位長さあたりの利益を表す整数 profit と、1回の切断にかかるコストを表す整数 cost が与えられます。ロッドからは長さに応じて利益を得られますが、販売できるのは「すべて同じ長さ」のロッドだけです。また、ロッドを長さが整数になるように2つの断片に切断することは可能ですが、切断1回ごとに cost の費用が発生します。切断の回数に制限はありません。ここで、得られる利益の最大値を求めます。 入力例と計算方法 たとえば、入力が rodLen = [7, 10]、profit = 6、cost = 4 である場合、出力は 8
-
Pythonで2つの文字列を等しくするための最小削除回数を求めるプログラム
この記事では、2つの小文字からなる文字列 s と t が与えられたとき、それぞれの文字列から任意の文字を1つ削除するという操作を繰り返し、両方の文字列を等しくするために必要な最小の操作回数を求める方法を解説します。 例えば、入力が s = pipe、t = ripe の場合、出力は 2 になります。これは、s から p を、t から r をそれぞれ1回ずつ削除すれば、両方の文字列が同じ ipe になるためです。 解決のためのアプローチ この問題は、メモ化再帰(動的計画法)を使って効率的に解くことができます。基本的な考え方は次の通りです。 m := 文字列 s の長さ n := 文字列 t
-
Pythonで合計をkで割り切れるようにするために削除できる最小の部分リストの長さを求めるプログラム
問題の概要 正の整数のみを含むリスト nums と、正の整数 k が与えられます。残りの要素の合計が k で割り切れるようになるように、nums から削除できる最短の部分リスト(連続する要素列)の長さを求めてください。部分リストは空でも構いませんが、リスト全体を削除することはできません。条件を満たす削除方法が存在しない場合は -1 を返します。 具体例 例として、nums = [5, 8, 6, 3]、k = 8 のケースを考えてみましょう。現在の要素の合計は 5 + 8 + 6 + 3 = 22 です。ここで長さ 1 の部分リスト [6] を取り除くと、残りの合計は 16 となり、8 で割り
-
Pythonで文字列の異なる部分文字列の個数を数える方法(トライ木による解法)
文字列 s が与えられたとき、その中に含まれる「空でない異なる部分文字列」が何種類あるかを求める問題を考えてみましょう。例えば、入力が s = abaa の場合、出力は 8 になります。これは、部分文字列として [a, b, ab, ba, aa, aba, baa, abaa] の8種類が存在するためです。解法のアプローチ:トライ木(Trie)を使うこの問題は、トライ木と呼ばれるデータ構造を使うことで効率的に解くことができます。トライ木とは、文字列の集合を木構造で表現したもので、共通の接頭辞を持つ文字列同士が同じ経路を共有できるのが特徴です。これにより、重複する部分文字列を自動的にまとめて管
-
【Python】文字列を「同じ文字列の2回連結(t+t)」にするために必要な最小操作回数を求めるプログラム
小文字のみで構成された文字列 s が与えられているとします。ここで使用できるのは、次の3種類の操作です。 任意の1文字を削除する 任意の位置に1文字を挿入する 任意の1文字を別の文字に更新(置き換え)する これらの操作を組み合わせて、s を「ある文字列 t を2回連結した形(s = t + t)」に変換するとき、必要となる最小の操作回数を求めるのが本記事のテーマです。 たとえば、入力が s = pqrxqsr の場合、答えは 2 になります。「x」を「p」に更新し、「s」を削除すれば s = pqrpqr となり、t = pqr を2回連結した文字列と一致するためです。 解き方のアプロー
-
Python Pandas – 特定の時系列頻度でDateTimeIndexから分を抽出する方法
特定の時系列頻度で作成した DateTimeIndex から「分(minute)」を抽出するには、DateTimeIndex.minute プロパティを使用します。このプロパティは、インデックス内の各日時に対応する分の値を Int64 型の配列として返します。 必要なライブラリをインポートする まず、pandas をインポートします。 import pandas as pd DateTimeIndex を作成する 次に、期間(periods)を 6、頻度(freq)を T(=分単位)とし、タイムゾーンをオーストラリア/シドニー(Australia/Sydney)に設定した DatetimeI
-
Python Pandas:特定の時系列頻度でDateTimeIndexから秒を抽出する方法
特定の時系列頻度を持つDateTimeIndexから秒を抽出するには、PandasのDateTimeIndex.secondプロパティを使用します。このプロパティは、インデックス内の各日時から秒の部分(0〜59の整数値)を取り出し、Indexオブジェクトとして返します。必要なライブラリのインポートまず、必要なライブラリをインポートしましょう。import pandas as pd秒単位のDatetimeIndexを作成するpd.date_range()を使って、要素数(periods)を6、頻度(freq)を'S'(秒)に設定したDatetimeIndexを作成します。タイムゾ
-
Python Pandas - 特定の時系列頻度のDateTimeIndexからマイクロ秒を抽出する方法
特定の時系列頻度を持つDateTimeIndex(日時インデックス)からマイクロ秒を抽出するには、DateTimeIndex.microsecondプロパティを使用します。このプロパティは、各日時要素のマイクロ秒部分(0〜999999)を整数値として返します。 まず、必要なライブラリをインポートします。 import pandas as pd 次に、periods=6、頻度(freq)を「us」=マイクロ秒としてDatetimeIndexを作成します。タイムゾーンはAustralia/Sydney(オーストラリア/シドニー)に設定します。 datetimeindex = pd.date_ra
-
Python Pandas:datetime.dateオブジェクトのNumPy配列を返す方法
Pythonのdatetime.dateオブジェクトからなるNumPy配列を取得するには、PandasのDatetimeIndex.dateプロパティを使用します。このプロパティを使うと、タイムスタンプから日付部分だけを抽出し、NumPy配列として簡単に取得できます。必要なライブラリのインポートまず、必要なライブラリをインポートしましょう。import pandas as pdDatetimeIndexの作成次に、期間3、頻度ns(ナノ秒)でDatetimeIndexを作成します。タイムゾーンは「Australia/Sydney」を指定しています。datetimeindex = pd.date
-
Pythonで解く!ブラックリストの段を避けてボールが高さ0に落ちる経路の数を数える方法
問題の概要高さ h と数値リスト blacklist が与えられます。ボールは現在 高さ h にあり、これを高さ 0 まで下ろすゲームを考えます。移動のルールは次の通りです。偶数ラウンド(0から開始):ボールを 1 段・2 段・4 段のいずれかで下げられる奇数ラウンド:ボールを 1 段・3 段・4 段のいずれかで下げられる一部の段はブラックリストに登録されており、ボールがそこに到達すると即座に消滅するこのとき、ボールが高さ 0 に到達する移動方法の総数を求めます。答えが大きくなりすぎる場合は、109 + 7 で割った余りを返してください。例えば、入力が h = 5、blacklist = [2
-
Python Pandas入門:DateTimeIndexからナノ秒を抽出する方法(nanosecondプロパティ活用)
PandasのDateTimeIndex.nanosecondプロパティを使用すると、特定の時系列頻度を持つDateTimeIndexからナノ秒を簡単に抽出できます。本記事では、実際のコード例を交えながら、その使い方をわかりやすく解説します。必要なライブラリのインポートまず、Pandasライブラリをインポートします。import pandas as pdナノ秒頻度のDateTimeIndexを作成する次に、pd.date_range()関数を使って、期間6・頻度「ns」(ナノ秒)・タイムゾーン「Australia/Sydney」を指定したDatetimeIndexを作成します。datetime
-
Python Pandas – datetime.timeオブジェクトのNumPy配列を返す方法
Pythonのdatetime.timeオブジェクトからなるNumPy配列を返すには、PandasのDatetimeIndex.timeプロパティを使用します。このプロパティを使うと、DatetimeIndex内の各Timestampから時刻部分だけを抽出できます。 DatetimeIndex.timeプロパティとは DatetimeIndex.timeは、インデックスに含まれる各Timestampの時刻情報を、タイムゾーン情報なしでdatetime.timeオブジェクトとして返します。日付部分が必要な場合は、同様にDatetimeIndex.dateプロパティを使うことでdatetime.d
-
【Python Pandas】timetzプロパティでタイムゾーン情報付きのdatetime.timeオブジェクトのNumPy配列を取得する方法
タイムゾーン情報を含むPythonのdatetime.timeオブジェクトからなるNumPy配列を返したい場合は、PandasのDatetimeIndex.timetzプロパティを使用します。このプロパティを使うと、DatetimeIndex内の各Timestampから日付情報を除いた「時刻部分」だけを抽出し、タイムゾーン(tzinfo)の情報も保持したまま取得できます。必要なライブラリのインポートまず、必要なライブラリをインポートします。import pandas as pdDatetimeIndexの作成次に、要素数5・頻度「ns」(ナノ秒)でDatetimeIndexを作成します。タイム
-
Pythonで障害のあるリストから欠落した正しいセンサー値を検出するプログラム
問題の概要 2つのリスト nums1 と nums2 があるとします。これらはそれぞれセンサーが計測した値を表しています。どちらのリストにも重複した値は含まれていません。ところが、片方のリストには正確な計測値が記録されている一方で、もう片方のリストには障害によって不正なデータが混入しています。 障害のあるリストでは、末尾以外の値が1つ削除され、その代わりに誤った値がリストの末尾に追加されています。この記事では、削除されてしまった本来のセンサー値を特定するプログラムを紹介します。 具体例 たとえば、次の入力を考えてみましょう。 nums1 = [5, 10, 15] nums2 = [10,