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

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

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

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

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

Python

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

Q&A

解決済

1回答

1253閲覧

データを出力した時にNaNを消したい。

m-nakao

総合スコア2

CSV

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

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

Python

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

0グッド

0クリップ

投稿2021/12/07 05:46

**1.pythonでcsvデータを読みこんで、8時から17時まで15分毎のデータを表示させたいため,下記のプログラムを作成しています。
**

python

1import csv, os 2import pandas as pd 3import numpy as np 4import datetime 5 6#対象のファイルのパス文字列を指定 7file_path = os.path.join(".","/home/pi/Desktop/cplog.csv") 8print("file name:" + file_path) 9 10#CSVファイルからdfへ変換 11df = pd.read_csv(file_path,names = ["tm","CP1","CP2","CP3","CP4"]) 12df["tm"] = pd.to_datetime(df["tm"]) 13 14#読み込んだデータの表示 15df.head(97500) 16print(df) 17 18#TODO:dfからの目的のデータの取得 19ret1 = df.groupby(pd.Grouper(key="tm", axis=0, freq='900S')).mean()['CP1'].reset_index() 20ret2 = df.groupby(pd.Grouper(key="tm", axis=0, freq='900S')).mean()['CP2'].reset_index() 21ret3 = df.groupby(pd.Grouper(key="tm", axis=0, freq='900S')).mean()['CP3'].reset_index() 22ret4 = df.groupby(pd.Grouper(key="tm", axis=0, freq='900S')).mean()['CP4'].reset_index() 23 24print(ret1,ret2,ret3,ret4) 25

2.読みこむCSVのデータ
時間は8:00~17:00までです。ラズベリーパイは自動で電源ON,OFFにしています。

2021/12/6 8:00:00 243 87 151 139
2021/12/6 8:00:01 248 88 168 138
2021/12/6 8:00:02 254 87 145 127
2021/12/6 8:00:03 253 86 153 134
2021/12/6 8:00:04 251 87 144 127
2021/12/6 8:00:05 247 87 159 127

3.プログラムを実装すると

Name: CP2, Length: 377, dtype: float64 tm
2021-12-03 16:00:00 69.503546
2021-12-03 16:15:00 98.130841
2021-12-03 16:30:00 100.000000
2021-12-03 16:45:00 99.065421
2021-12-03 17:00:00 100.000000
2021-12-03 17:15:00 NaN
2021-12-03 17:30:00 NaN
2021-12-03 17:45:00 NaN
2021-12-03 18:00:00 NaN
2021-12-03 18:15:00 NaN

となってしまい、17時以降も表示されてしまいます。

how allを使用してもエラーになってしまうため困っております。

python

1print(ret1,(how = 'all'))

Traceback (most recent call last):
File "/home/pi/Desktop/desuktop20211110/testprogram/test2021120702.py", line 23
print(ret1,(how = 'all'))
^
SyntaxError: invalid syntax

date_rangeを使用してもエラーがでます

python

1#CSVファイルからdfへ変換 2df = pd.read_csv(file_path,names = ["tm","CP1","CP2","CP3","CP4"]) 3df["tm"] = pd.to_datetime(df["tm"]) 4tm = pd.date_range('08:00:00','17:00:00') 5

Traceback (most recent call last):
File "/home/pi/Desktop/desuktop20211110/testprogram/test2021120701.py", line 23
ret1 = df.groupby(pd.Grouper(key="tm", axis=0, 08:00:00 17:00:00 freq='900S')).mean()['CP1']
^
SyntaxError: invalid token

4.出力させたいデータは8時から17時までなので、どなたか値がNanの部分を表示されない方法をご教示ください。**

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

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

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

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

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

guest

回答1

0

ベストアンサー

pandas.Series.between を使ってみてはどうでしょうか。

python

1df = pd.read_csv(file_path,names = ["tm","CP1","CP2","CP3","CP4"], header=None) 2df["tm"] = pd.to_datetime(df["tm"]) 3 4begin = pd.to_datetime('08:00').time() 5end = pd.to_datetime('17:00').time() 6 7print(df[df["tm"].dt.time.between(begin, end)])

投稿2021/12/07 06:22

編集2021/12/07 06:47
melian

総合スコア20655

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

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

melian

2021/12/07 06:47 編集

間違えたので修正中です。。。 修正終わりました。
Deep_passion

2021/12/07 07:14

[ご質問,お仕事を一緒にさせていただけないでしょうか?] melianさん、お世話になっております。 メールではできかねるとこちらがわで誠に勝手ながらではありますが、判断させていただきました。 フリーランスで案件を受注した際にもし自力では解けない場合は、melianさんに質問させていただいて、その御礼としまして、6割のマージンをmelianさんにおしはらいさせていただくという形態での契約を考えております。僕は只今ニートです。自律神経失調症、統合失調症のために、会社でははたらくことができません。 そのため、メンターをずっとずっと探していました。melianさんじゃないとだめなんです。 ただ質問にこたえてくださるのか?それとも,僕と一緒に世界を変えませんか? よろしくおねがいします。
Deep_passion

2021/12/07 07:15

m-nakaoさん> 申し訳ありません。
m-nakao

2021/12/07 09:08

melian様 早速の回答、ありがとうございます。 8時から17時まで15分おきに読み取り値を計算し平均を表示したいので、group byを用いています。 ご教示いただいたbetweenはどの箇所に入れればよいか、ご教示をお願いします。
melian

2021/12/07 11:30

グループ化したデータフレームを df_grp として、以下の様にします。 df_grp = df.groupby(pd.Grouper(key='tm', axis=0, freq='900S')).mean() time_range = df_grp.index.to_series().dt.time.between(begin, end) print(df_grp[time_range])
m-nakao

2021/12/08 00:42

meilan様 ありがとうございます。 実装し、想定した通り稼動しました。 import csv, os import pandas as pd import numpy as np import datetime import time #対象のファイルのパス文字列を指定 file_path = os.path.join(".","/home/pi/Desktop/cplog.csv") print("file name:" + file_path) #CSVファイルからdfへ変換 df = pd.read_csv(file_path,names = ["tm","CP1","CP2","CP3","CP4"]) df["tm"] = pd.to_datetime(df["tm"]) begin = pd.to_datetime('08:00').time() end = pd.to_datetime('17:00').time() #TODO:dfからの目的のデータの取得 ret1 = df.groupby(pd.Grouper(key="tm", axis=0, freq='900S')).mean()['CP1'] time_range = ret1.index.to_series().dt.time.between(begin, end) ret2 = df.groupby(pd.Grouper(key="tm", axis=0, freq='900S')).mean()['CP2'] time_range = ret2.index.to_series().dt.time.between(begin, end) ret3 = df.groupby(pd.Grouper(key="tm", axis=0, freq='900S')).mean()['CP3'] time_range = ret3.index.to_series().dt.time.between(begin, end) ret4 = df.groupby(pd.Grouper(key="tm", axis=0, freq='900S')).mean()['CP4'] time_range = ret4.index.to_series().dt.time.between(begin, end) print(ret1[time_range],ret2[time_range],ret3[time_range],ret4[time_range]) time.sleep(60)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問