-
Python pandas入門:タイムゾーン情報を除いてDateTimeIndexをSeriesに変換する方法
pandasでDateTimeIndex(日時インデックス)をSeriesに変換する際、タイムゾーン情報を除外したいケースがあります。その場合は、datetimeindex.tz_convert(None).to_series()を使用します。tz_convert(None)によってタイムゾーン情報を取り除き、その結果をSeriesへ変換できます。 基本的な手順 まず、必要なライブラリをインポートします。 import pandas as pd 次に、期間5・頻度「S」(秒)のDatetimeIndexを作成します。ここではタイムゾーンとして「Australia/Adelaide」を指定し、4
-
【Python・Pandas】インデックスを無視してDateTimeIndexからDataFrameを作成する方法
PandasのDateTimeIndexからインデックスを無視してDataFrameを作成するには、to_frame()メソッドを使用します。このとき、パラメータindexにFalseを指定することで、元のインデックスを引き継がないDataFrameを生成できます。必要なライブラリのインポートまず、必要なライブラリをインポートします。import pandas as pdDateTimeIndexの作成次に、周期5、頻度「S」(秒)でDatetimeIndexを作成します。タイムゾーンにはオーストラリアのアデレード(Australia/Adelaide)を指定し、40秒間隔の時系列データを生成
-
Python Pandas:DateTimeIndexからDataFrameを作成し、結果の列名を上書きする方法
DateTimeIndexからDataFrameを作成するには、to_frame()メソッドを使用します。このメソッドは、インデックスの日時データをそのままDataFrameの列へ変換できる便利な機能です。さらに、nameパラメータを指定することで、生成される列の名前を任意の文字列に上書きできます。本記事では、その具体的な使い方をサンプルコード付きで解説します。必要なライブラリのインポートまず、pandasをインポートします。import pandas as pdDatetimeIndexの作成次に、periods(要素数)を5、freq(頻度)を「40S」=40秒間隔としてDatetimeI
-
Pythonで長さk・距離nとなる辞書式最小の小文字文字列を求めるプログラム
問題の概要2つの整数 n と k が与えられたとき、長さが k で「距離」がちょうど n になる、辞書式順序で最も小さい小文字の英字列を見つけることを考えます。ここでいう「距離」とは、文字列を構成する各文字のアルファベット上の番号(a=1、b=2、…、y=25、z=26)の合計のことです。具体例たとえば入力が n = 15、k = 3 の場合、出力は「aam」となります。「aam」は長さ3で、その距離が 1 + 1 + 13 = 15 を満たす、辞書式順序で最小の文字列だからです。解き方のアプローチこの問題は貪欲法(グリーディー法)で効率よく解けます。まず全文字を「a」(番号1)で初期化し、余
-
Python PandasでTimedeltaIndexオブジェクトを作成する方法
TimedeltaIndexオブジェクトを作成するには、pandas.TimedeltaIndex()メソッドを使用します。このメソッドを使うと、timedelta形式のデータをインデックスとして扱うことができ、時間差(期間)のデータ分析に非常に便利です。必要なライブラリのインポートまず、必要なライブラリをインポートします。import pandas as pdTimedeltaIndexオブジェクトの作成次に、TimedeltaIndexオブジェクトを作成します。「data」パラメータを使用して、timedelta形式のデータを設定します。tdIndex = pd.TimedeltaInde
-
Pythonでn人がスイッチを切り替えた後に点灯しているライトの数を求めるプログラム
部屋の中にn個のトグルスイッチがあり、そこにn人がいるとします。彼らは以下のルールに従ってスイッチを切り替えていきます。 1番目の人は、すべてのスイッチを切り替えます。 2番目の人は、2の倍数にあたるスイッチ(2, 4, 6, ...)を切り替えます。 i番目の人は、iの倍数にあたるスイッチを切り替えます。以降も同様です。 このとき、最終的にONの状態になっているスイッチの数を求める必要があります。 例えば、入力がn = 5の場合、出力は2になります。初期状態では電球は [0, 0, 0, 0, 0] です。 1番目の人の操作後: [1, 1, 1, 1, 1] 2番目の人の操作後: [
-
【Python Pandas】TimedeltaIndexから各要素の日数(days)を抽出する方法
TimedeltaIndexオブジェクトから各要素の日数を抽出するには、TimedeltaIndex.daysプロパティを使用します。このプロパティは、各timedelta要素に含まれる「日」の部分を整数値(int64)として返します。時間や分などの情報は無視され、純粋な日数のみが取得できる点が特徴です。 必要なライブラリのインポート まず、pandasをインポートします。 import pandas as pd TimedeltaIndexオブジェクトの作成 次に、TimedeltaIndexオブジェクトを作成します。「data」パラメータを使って、timedelta形式の文字列データを設定
-
Pythonでリストを条件を満たす2つの部分に分割する際の前半部分の最小長を求めるプログラム
数値のリスト nums が与えられたとき、このリストを part1 と part2 の2つの部分に分割することを考えます。ただし、part1 のすべての要素は part2 のすべての要素以下である必要があります。このとき、part1 として可能な最短の長さ(長さ0は除く)を求めましょう。 例えば、入力が nums = [3, 1, 2, 5, 4] の場合、出力は 3 になります。これは、part1 = [3, 1, 2]、part2 = [5, 4] のように分割できるからです。 解決のための手順 この問題を解くには、以下の手順に従います。 p := nums の最小値 s := 0 i
-
ログを切り詰めてデータベースに保存する際の最大サイズを求めるPythonプログラム
数値のリスト logs と値 limit が与えられているとします。リストの各要素 logs[i] は i 番目のユーザーが生成したログのサイズを表し、limit はデータベースに保存できるログの合計サイズの上限を表します。ここで、logs 内のすべてのログをサイズ x 以下に切り詰めたとき、残ったログサイズの合計が limit 以下となるような最大の x を求める必要があります。なお、どのログも切り詰める必要がない場合は、単純に最大のログサイズを返します。 例として、入力が logs = [500, 200, 10000, 500, 4000]、limit = 3000 の場合を考えてみまし
-
Pythonで1つの0を反転した後に得られる、連続する1の最長部分文字列の長さを求めるプログラム
バイナリ文字列 s が与えられたとします。「0」を「1」に反転できるのは最大1回までという条件のもとで、連続する「1」からなる最長の部分文字列の長さを求める必要があります。例えば、入力が s = 1010110001 の場合、出力は 4 になります。インデックス3にある「0」を反転すると文字列は 1011110001 となり、このとき連続する「1」の最長部分文字列の長さが4になるためです。解決アプローチ:スライディングウィンドウこの問題はスライディングウィンドウ(2ポインタ)のテクニックを使うことで効率的に解けます。ウィンドウ内に含まれる「0」の数が1個以下である状態を保ちながら右端を伸ばし、
-
Pythonで指定した差を持つ最長等差部分列の長さを求めるプログラム
数値のリスト nums と整数 diff が与えられたとき、隣り合う要素同士の差がすべて diff と一致するような最長の等差部分列(算術サブシーケンス)の長さを求める問題を考えます。 たとえば、nums = [-1, 1, 4, 7, 2, 10]、diff = 3 の場合を考えてみましょう。このとき、部分列 [1, 4, 7, 10] を選ぶことができ、各要素間の差はすべて 3 になるため、答えは 4 となります。 解法のアプローチ この問題は動的計画法(DP)の考え方を使うと効率的に解けます。各値について「その値で終わる等差部分列の最大長」を辞書に記録しながら、リストを一度走査するだけで
-
Pythonで2進数表現における最長の連続する1を見つけるプログラム
問題の概要 負でない整数 n が与えられたとき、その2進数表現の中に現れる「1」が連続して並んでいる区間のうち、最も長いものの長さを求めることを考えます。 例として、入力が n = 1469 の場合を見てみましょう。1469 を2進数に変換すると「10110111101」となり、この中には「1」が4個連続して並んでいる箇所が存在します。したがって、出力は 4 となります。 解法のアプローチ この問題は、ビット演算を活用することで非常にエレガントに解くことができます。手順は以下の通りです。 カウント用の変数 count を 0 で初期化します。 n が 0 になるまで、次の処理を繰り返します
-
Pythonで一意な要素からなる最長の連続サブリストの長さを求める方法
重複のない(すべての要素が一意な)数値リスト nums が与えられたとき、その中から「連続する整数で構成される最長の部分リスト」の長さを求める問題を考えます。 例えば、nums = [3, 6, 7, 5, 4, 9] の場合、答えは 5 になります。これは、部分リスト [3, 6, 7, 5, 4] が 3 から 7 までの連続する整数をすべて含んでいるためです。 解法のアプローチ この問題は、すべての部分リストを走査する O(n²) のアプローチで効率よく解けます。ポイントは以下の通りです。 各開始位置 i について、終了位置 j を右へ伸ばしながら、範囲内の最小値 lhs と最大値 r
-
Pythonで「a」から始まる連続増加部分文字列の最長長さを求めるプログラム
問題の概要小文字の英字と「?」記号を含む文字列 s が与えられます。各「?」については、削除するか、任意の小文字の英字に置き換えることができます。このとき、「a」で始まる連続して増加する部分文字列(例:abcdef のようにアルファベット順に1文字ずつ進む文字列)の最長の長さを求める必要があります。例えば、入力が s = vta???defke の場合、出力は 6 になります。これは、s を vtabcdefke に変換できるためです。変換後の文字列には abcdef という連続増加部分文字列が含まれており、これが「a」で始まる最長のものとなります。解法のアプローチこの問題は、文字列を一度走査
-
【Python】1つの要素を削除して作れる最長の連続増加部分リストの長さを求めるアルゴリズム
問題概要 数値のリスト nums が与えられたとき、最大で1つの要素を削除できるという条件のもとで、連続した「厳密に増加する」部分リスト(サブリスト)の最大の長さを求めます。ここで「厳密に増加する」とは、隣り合う要素が必ず前より大きくなっている状態を指します。 例えば、入力が nums = [35, 5, 6, 7, 8, 9, 12, 11, 26] の場合、答えは 7 になります。これは、リストから 12 を削除すると [5, 6, 7, 8, 9, 11, 26] となり、この部分リストの長さが7で、これ以上長い連続増加部分リストは存在しないためです。 解法のアプローチ:両方向からのD
-
Pythonで最長のマトリックスパスの長さを求めるプログラム
問題の概要0が空きセル、1が壁を表すバイナリ行列(マトリックス)を考えます。最初の行の任意の空きセルからスタートし、最後の行の任意の空きセルに到達することを目指します。移動できるのは「左」「右」「下」の3方向のみで、各セルは最大1回しか訪れることができません。この条件のもとで、最も長いパスの長さを求める必要があります。到達が不可能な場合は0を返します。例えば、入力が以下のような行列だったとします。000000010000この場合の出力は10です。(0, 3) → (0, 2) → (0, 1) → (0, 0) → (1, 0) → (1, 1) → (1, 2) → (2, 2) → (2,
-
Pythonで単語リストから最長の接頭辞(プレフィックス)連鎖を求める方法
この記事では、Pythonを使って「単語リストの中から、前の単語が次の単語の接頭辞(プレフィックス)になっており、次の単語にはちょうど1文字だけ新しい文字が追加されている」という条件を満たす最長の連鎖(シーケンス)の長さを求めるプログラムを紹介します。問題の概要小文字の文字列からなるリスト w が与えられます。この中から、以下の条件を満たす最長のシーケンスを見つけ、その長さを返します。シーケンス内の各単語は、直前の単語の接頭辞である次の単語は、前の単語にちょうど1文字追加したものになっている例えば、入力が w = [pqr, pq, m, mn, pqrs] の場合、出力は 3 になります。こ
-
Pythonで文字列内に2回以上出現する最長部分文字列の長さを求めるプログラム
小文字のみで構成された文字列 s が与えられたとき、s の中に少なくとも2回以上出現する最長の部分文字列の長さを求めます。そのような部分文字列が存在しない場合は 0 を返します。たとえば、入力が s = abdgoalputabdtypeabd の場合、2回以上出現する最長の部分文字列は abd なので、出力は 3 になります。解法のアプローチ:接尾辞(サフィックス)の活用この問題は「接尾辞」という考え方を使うとスマートに解けます。文字列に2回以上現れる部分文字列は、必ず開始位置の異なる2つの接尾辞の共通接頭辞として現れます。そこで、すべての接尾辞を辞書順にソートすれば、似た接尾辞どうしが隣り
-
Pythonで「最小値の2倍が最大値より大きい」条件を満たす最長の部分リストの長さを求めるプログラム
問題の概要数値のリスト nums が与えられたとき、「部分リストの最小値の2倍が最大値より大きい」という条件(2 × 最小値 > 最大値)を満たす、最長の連続する部分リストの長さを求めることを考えます。例えば、入力が nums = [10, 2, 6, 6, 4, 4] の場合、出力は 4 になります。これは、部分リスト [6, 6, 4, 4] が条件 (2×4) > 6 を満たす最長の部分リストだからです。解決アプローチ:スライディングウィンドウ + モノトニックデックこの問題は、スライディングウィンドウ(尺取り法)とモノトニックデック(両端キュー)を組み合わせることで効率的に
-
Python Pandas入門:TimeDeltaIndexから各要素の「秒」成分を抽出する方法
PandasのTimedeltaIndexオブジェクトから各要素の「秒」の値を抽出したい場合は、TimedeltaIndex.secondsプロパティを使用します。この記事では、実際のコード例とともに、その使い方をわかりやすく解説します。 TimedeltaIndex.secondsプロパティとは .secondsプロパティは、各timedelta要素に含まれる時間・分・秒のうち、「秒」の成分(0〜86399の範囲)を整数値として返します。注意点として、日数(days)は含まれないため、合計秒数を取得したい場合は別途total_seconds()メソッドを使う必要があります。 必要なライブ