🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

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

Python

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

PyCharm

エディター・開発ツール

Q&A

解決済

2回答

1021閲覧

[Python3]Excel表から指定された複数の数値から一番直近のデータだけを取り出したい

MM921

総合スコア14

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

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

Python

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

PyCharm

エディター・開発ツール

0グッド

1クリップ

投稿2021/02/10 02:57

前提・実現したいこと

[Python3]Excel表から指定された複数の数値の中から最小の数をセルに書き込みたい
上記リンクは以前質問したもので,今回は最小値ではなく直近のデータだけ取り出したいというものです。
python3.8でExcelの出庫履歴表から決算表(最終的にどの備品がどれくらい残っているかを見られるようにするための表)を作ろうとしていています。
複数の数値が指定されたとき,一番最近のデータだけを取り出したいのですがその数値を選択することができません。

お時間があれば有識者の方々,お手柔らかにご教示お願い致します。

発生している問題・エラーメッセージ

今回も例としてaaaの最終的な備品個数をprint表示させる場合を実行します。
aaaが表の中で2つ以上出てきたとき,該当数値すべてをprint表示はできるもののoffsetという一つの変数の中の数値だからかどちらも選択することができません。

備品名備品個数消費個数日付
hhh29212021/02/09
ggg29612021/02/09
ggg29702021/02/09
ggg29702021/02/09
ggg29702021/02/09
lll29612021/02/08
lll29612021/02/08
lll29622021/02/08
lll29612021/02/08
lll29612021/02/08
lll29622021/02/08
kkk29912021/02/08
jjj29812021/02/08
iii29522021/02/08
ggg29712021/02/08
ggg29712021/02/08
fff25312021/02/08
eee24912021/02/08
ddd24912021/02/08
ccc21512021/02/08
bbb22312021/02/08
aaa13912021/02/08
lll29812021/02/08
lll29822021/02/08
kkk29912021/02/08
jjj29912021/02/08
iii29722021/02/08
ggg29812021/02/08
ggg29812021/02/08
fff25412021/02/08
eee25012021/02/08
ddd25012021/02/08
ccc21612021/02/08
bbb22412021/02/08
aaa14012021/02/08
lll30002021/02/04
ggg29912021/02/04
fff25522021/02/03
eee25122021/02/03
ddd25112021/02/03
bbb22512021/02/03
fff25712021/02/03
eee25322021/02/03
ccc21722021/02/03
aaa14112021/02/03

該当のソースコード

aaaの備品個数に相当する数はaaaの右隣に位置しているためoffset関数を用いて表示しました。
以下が該当のコードです。

import openpyxl as px wb = px.load_workbook('出庫履歴の表.xlsx') ws = wb["Sheet1"] B2_COL = 1 B8_ROW = 1 E2_COL = 9 E6_ROW = 137 # 範囲データを順次処理 for row in ws.iter_rows(min_col=B2_COL, min_row=B8_ROW, max_col=E2_COL, max_row=E6_ROW): for cell in row: # 該当セルの値取得 cell_value = cell.value o = cell.offset(0, 1) offset = o.value # セル範囲内に該当の文字列が存在する場合表示 if str('aaa') in str(cell_value): print(offset) # ロードしたExcelファイルを閉じる wb.close()

試したこと

pandasのdataframeに日付同士を比較できるものがないか自分なりに調べてもヒットしませんでした。

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

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

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

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

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

ppaul

2021/02/10 04:38

gggについては、2021/02/09が4回あります。このような場合、4個のうちのどれを取り出したいのでしょうか?
MM921

2021/02/10 05:03

ppaulさん,質問への追記・修正等のご依頼ありがとうございます。 記載不足でわかりづらかったですね…申し訳ありません。 表の一番上に出てくる総備品個数を取り出したいと考えています。
ppaul

2021/02/10 06:43

では、2021/02/08などの各日付についてgggの一番上にあるものも取り出したいのか、全体としてgggの一番上にあるものだけ取り出せばよいのかどちらでしょうか?
MM921

2021/02/10 07:26

ppaulさん,返信ありがとうございます。 そうですね,私がこうしたいという形には後述の「全体としてgggの一番上にあるものだけ取り出せばよい」が当てはまります。
guest

回答2

0

ベストアンサー

to_datetimeで型を日付に変えてからなら、ソートできますよ。
pandasで日付・時間の列を処理(文字列変換、年月日抽出など)
pandas.DataFrame, Seriesをソートするsort_values, sort_index

最初からpandasで読み込めば、日付として読み込むのでソートもされてます。

python3

1import pandas as pd 2df = pd.read_excel("出庫履歴の表.xlsx") 3 4# たとえば備品名gggについてグループ化 5print(df.groupby("備品名").get_group("ggg")) 6# 備品名 備品個数 消費個数 日付 7# 1 ggg 296 1 2021-02-09 8# 2 ggg 297 0 2021-02-09 9# 3 ggg 297 0 2021-02-09 10# 4 ggg 297 0 2021-02-09 11# 14 ggg 297 1 2021-02-08 12# 15 ggg 297 1 2021-02-08 13# 27 ggg 298 1 2021-02-08 14# 28 ggg 298 1 2021-02-08 15# 36 ggg 299 1 2021-02-04 16 17# 最新のデータ 18print(df.groupby("備品名").get_group("ggg").head(1)) 19# 備品名 備品個数 消費個数 日付 20# 1 ggg 296 1 2021-02-09

投稿2021/02/10 03:48

編集2021/02/10 04:03
jeanbiego

総合スコア3966

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

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

MM921

2021/02/10 05:00

jeanbiegoさん,ご回答ありがとうございます。 コードを参考にしてみたところ,最新のデータが反映されていました! 追加の質問で申し訳ないのですが,お付き合いいただければ嬉しいです。 これからさらに備品個数だけまで絞っていく際にはgroupbyなどを使えばよいのでしょうか? それともまた別の方法があるのでしょうか?
jeanbiego

2021/02/10 05:25

print(df.groupby("備品名").get_group("ggg").head(1)["備品個数"]) たとえば追加でこのように指定すれば、備品個数が得られます
MM921

2021/02/10 05:37

jeanbiegoさん,重ねて教えていただきありがとうございます! 上記の["備品個数"]を加えたら備品個数のみが反映されていて希望通りの結果となりました。 貴重なアドバイスをありがとうございました!
guest

0

文法あやしいですが雰囲気こんな感じでどうですか。

Python

1for row in ws.iter_rows(min_col=B2_COL, min_row=B8_ROW, max_col=E2_COL, max_row=E6_ROW): 2 for cell in row: 3 # 該当セルの値取得 4 cell_value = cell.value 5 o = cell.offset(0, 1) 6 offset = o.value 7 # セル範囲内に該当の文字列が存在する場合 8 if str('aaa') in str(cell_value): 9 # 暫定一位を覚えておく 10 if cell.offset(0, 3).value > d: 11 d = cell.offset(0, 3).value 12 v = offset 13# 最後に出力 14print(v) 15

投稿2021/02/10 03:53

編集2021/02/10 03:54
jinoji

総合スコア4592

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

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

MM921

2021/02/10 04:53

jinojiさん,ご回答ありがとうございます! ご提案していただいたコードを試してみましたところ,以下のようなエラーが発生しました。 if cell.offset(0, 3).value > d: NameError: name 'd' is not defined d=cell.offset……の部分をif構文の前部分に移動させ実行しても応答がないようです。。。 この場合,どのように対処すべきなのでしょうか? 以上は追加での質問ですのでお時間あるときに見ていただけたら幸いです。
jinoji

2021/02/10 05:02

一番最初に、d = 0 という1文を加えてみてはどうでしょう。
MM921

2021/02/10 05:20

jinojiさん,重ねてのご提案ありがとうございます! >>>一番最初に、d = 0 という1文を加えてみてはどうでしょう。 試してみましたが,以下のエラーが出てしまいました。。。 if cell.offset(0, 3).value > d: TypeError: '>' not supported between instances of 'str' and 'int' その時起動したコードは以下のようになっています。 import openpyxl as px import pandas as pd wb = px.load_workbook('出庫履歴の表.xlsx') ws = wb["Sheet1"] d = 0 B2_COL = 1 B8_ROW = 1 E2_COL = 9 E6_ROW = 137 A_0 = A = aaa = 'ロボットシリコン先' # 範囲データを順次処理 for row in ws.iter_rows(min_col=B2_COL, min_row=B8_ROW, max_col=E2_COL, max_row=E6_ROW): for cell in row: # 該当セルの値取得 cell_value = cell.value o = cell.offset(0, 1) offset = o.value d = 0 # セル範囲内に該当の文字列が存在する場合 if str(aaa) in str(cell_value): # 暫定一位を覚えておく if cell.offset(0, 3).value > d: d = cell.offset(0, 3).value v = offset # 最後に出力 print(v) # ロードしたExcelファイルを閉じる wb.close() どこか悪さをしているんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問