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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

openpyxl

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

Q&A

解決済

1回答

5596閲覧

openpyxlで変換したExcelファイルの特定箇所を文字列から数字にしたいです。

rr9500sc

総合スコア16

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

openpyxl

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

0グッド

0クリップ

投稿2020/06/05 19:49

編集2020/06/06 09:52

プログラミング初心者です。
拙い質問ですがよろしくお願いします。

csvファイルをxlsxファイルに変換し、
変換されたファイルの空いているセルにExcel関数を入れ、求められた値を抽出するプログラムを組んでいます。

Excel関数を入れるところまでは出来たのですが
変換されたxlsxファイルの数値が全て文字列という扱いになっており、
計算が上手くされませんでした。

以下、コードです。

(python) import pandas as pd import re import csv import openpyxl with open('filename.csv', 'r', newline='') as file, \ open('file_out.csv', 'w', newline='') as fileout: text = re.sub(r'\s* ', ',', file.read()) print(text, file = fileout) print('置換完了') col_names = [1,2,3,4,5] df = pd.read_csv('file_out.csv',encoding='cp932',names=col_names) df.to_excel('excel-data.xlsx') print('CSV > Excel変換完了') wb = openpyxl.load_workbook('excel-data.xlsx',data_only=True) sheet = wb.worksheets[0] sheet["E2"] = '=AVERAGEIFS(D17:D2000,C17:C2000,">=0",C17:C2000,"<=1.5")' wb.save('excel-data.xlsx')

以上を入力して出来たファイルがこちらです。

(xlsx) 1    2    3    4    5 V1.0.2 Interpolation #DIV/0! レコード数 872 サンプリング周波数(Hz) 100 0m位置 7 高さ補正 2 コメント1 12 コメント2 タイプ(0:なし 1:3点移動平均 2:バターワース) 2 フィルタ遮断周波数 4 フィルタ回数 3 遮断周波数 1 始終点処理点数 20 Saturday 19.10.2019 16:18:51 補間位置情報数 0 ID 距離(m) 速度(m/s) 0 -5.689224 0 1 -5.694527 0 2 -5.699684 -0.507 3 -5.70468 -0.491 4 -5.709504 -0.473 5 -5.71415 -0.455 6 -5.718608 -0.436 7 -5.722875 -0.417 8 -5.726947 -0.397 9 -5.730822 -0.378 10 -5.734498 -0.358 11 -5.737978 -0.338 12 -5.741262 -0.319 13 -5.744353 -0.3 14 -5.747254 -0.281 15 -5.749968 -0.262 16 -5.7525 -0.244 17 -5.754853 -0.227 18 -5.757033 -0.21 19 -5.759046 -0.193 20 -5.760897 -0.178 21 -5.762592 -0.162 22 -5.76414 -0.148 23 -5.765546 -0.134 24 -5.766817 -0.121 25 -5.767962 -0.109 26 -5.768986 -0.097 27 -5.769897 -0.086 28 -5.770699 -0.075 29 -5.771398 -0.065 30 -5.772 -0.056 31 -5.77251 -0.047 32 -5.772934 -0.039 33 -5.773278 -0.031 34 -5.773548 -0.024 35 -5.77375 -0.017 36 -5.773889 -0.011 37 -5.77397 -0.006 38 -5.773996 0 39 -5.773973 0.004 40 -5.773905 0.009 41 -5.773793 0.013 42 -5.773642 0.017 43 -5.773454 0.02 44 -5.773232 0.024 45 -5.77298 0.027 46 -5.772699 0.029 47 -5.772393 0.032 48 -5.772064 0.034 49 -5.771713 0.036 50 -5.771344 0.038 51 -5.770957 0.039 52 -5.770556 0.041 53 -5.770142 0.042 54 -5.769718 0.043 55 -5.769286 0.043 56 -5.768847 0.044 57 -5.768404 0.044 58 -5.767957 0.045 59 -5.767509 0.045 60 -5.76706 0.045 61 -5.766612 0.045 62 -5.766164 0.045 以下略

intやfloatは試しましたが解決には至りませんでした。
お手数ですが回答いただけたらと思います。
よろしくお願いします。

6月6日追記
原因はdfにより数値が文字列として扱われていました。
現在は”C17:D2000”の範囲を数値にする解決方法を探しております。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

dfの時点で数値部分が文字列になってないでしょうか。df.to_excel()は文字列は文字列として保存するのでexcelでは計算エラーになります。

投稿2020/06/05 22:24

x98000

総合スコア1096

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

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

rr9500sc

2020/06/06 04:20

回答ありがとうございます。 ただいまdfの部分をwsに変えて試したところ変化がなかったです… wsもdf同様文字列として保存されてしまうのでしょうか?
x98000

2020/06/06 05:39

wsってなんですか?
rr9500sc

2020/06/06 05:41

Dataframe(df)からworksheet(ws)にしたのですが 変化がなかったって意味です… 言葉足らずで申し訳ないです。
x98000

2020/06/06 05:49

いえ、そういうことではなく、read_csvの時点でdfの中の値が数値になっているのかということです。こちらではCSVの中身が見えないので。 あと、Excelの計算式は正しいですか?見たところ、D列には値が入っていないように見えますが。
rr9500sc

2020/06/06 06:00

file_outのフォルダ(csvファイル)は数字は数値として扱われておりました。 つまりおっしゃる通りdf.to_excel()で文字列になっているということですかね…? またExcelの関数なのですが確かにこの説明だとD列に何も入っていないようにしか見えませんが xlxsファイル上ですと1列目が空白になっているので関数に関しては合っていました。 また、単純な計算も出来ないのでやはり文字列であることが原因と思われます。
x98000

2020/06/06 06:03

df.dtypes で属性を確認してください
rr9500sc

2020/06/06 06:36

CSV > Excel変換完了 1 object 2 object 3 object 4 object 5 object dtype: object やはりobjectでした… ここから全ての数字またはC17:D2000のみを 数値に変換する方法を探せばいいのでしょうか?
x98000

2020/06/06 06:49

今の方法では列に文字列が一つでも入っていればその列はobject扱いになり、Excelへの出力も文字列になってしまいます。他のやり方としては、 ・数値行とそれ以外の行を分けて取り込む ・pd.read_csvを諦めて、csv.reader()で読み込む ・今のままでExcel上で計算に必要な範囲を数値に変換する といったところでしょうか。
x98000

2020/06/06 06:53

もう一つ、数値行までの行数が決まっているのであれば、 ・dfを上下に分割して、下側の計算に必要な列を数値に変換する という手もありますね
rr9500sc

2020/06/06 07:51

ありがとうございます。 ・3つ目の 今のままで必要範囲を数値に変換する方針で考えてみます。 現状、指定した範囲を数値化するのに苦戦しています。 for rows in sheet['C17':'D2000']: for cell in rows: print(cell.value) printの部分の代わりを探してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問