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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

4508閲覧

方形波時系列データの解析

atsunofu

総合スコア59

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/10/01 06:45

前提・実現したいこと

幅が種々異なる方形波の時系列データがcsv Fileで有ります。
これを各波形毎に分割しcsv Fileで出力したいのですが、方法が思いつきません。

イメージ説明

 sample data

NO. Time A
1 2000/1/1 0:01 0.05
2 2000/1/1 0:02 0.05
3 2000/1/1 0:03 0.05
4 2000/1/1 0:04 0.05
5 2000/1/1 0:05 0.05
6 2000/1/1 0:06 0.05
7 2000/1/1 0:07 0.05
8 2000/1/1 0:08 0.05
9 2000/1/1 0:09 0.05
10 2000/1/1 0:10 0.05
11 2000/1/1 0:11 0.05
12 2000/1/1 0:12 0.05
13 2000/1/1 0:13 0.05
14 2000/1/1 0:14 0.07
15 2000/1/1 0:15 0.05
16 2000/1/1 0:16 0.05
17 2000/1/1 0:17 0.05
18 2000/1/1 0:18 0.05
19 2000/1/1 0:19 0.05
20 2000/1/1 0:20 7.9
21 2000/1/1 0:21 7.93
22 2000/1/1 0:22 7.88
23 2000/1/1 0:23 7.81
24 2000/1/1 0:24 7.75
25 2000/1/1 0:25 7.7
26 2000/1/1 0:26 7.65
27 2000/1/1 0:27 7.63
28 2000/1/1 0:28 7.6
29 2000/1/1 0:29 7.6
30 2000/1/1 0:30 7.59
31 2000/1/1 0:31 7.57
32 2000/1/1 0:32 7.57
33 2000/1/1 0:33 7.57
34 2000/1/1 0:34 7.56
35 2000/1/1 0:35 7.56
36 2000/1/1 0:36 7.56
37 2000/1/1 0:37 7.56
38 2000/1/1 0:38 7.55
39 2000/1/1 0:39 7.56
40 2000/1/1 0:40 7.56
41 2000/1/1 0:41 7.56
42 2000/1/1 0:42 7.56
43 2000/1/1 0:43 7.55
44 2000/1/1 0:44 7.56
45 2000/1/1 0:45 7.56
46 2000/1/1 0:46 7.56
47 2000/1/1 0:47 7.56
48 2000/1/1 0:48 7.55
49 2000/1/1 0:49 7.55
50 2000/1/1 0:50 7.56
51 2000/1/1 0:51 7.56
52 2000/1/1 0:52 7.56
53 2000/1/1 0:53 7.56
54 2000/1/1 0:54 7.56
55 2000/1/1 0:55 7.56
56 2000/1/1 0:56 7.55
57 2000/1/1 0:57 7.56
58 2000/1/1 0:58 7.55
59 2000/1/1 0:59 7.56
60 2000/1/1 1:00 7.56
61 2000/1/1 1:01 7.56
62 2000/1/1 1:02 7.55
63 2000/1/1 1:03 7.56
64 2000/1/1 1:04 7.55
65 2000/1/1 1:05 7.56
66 2000/1/1 1:06 7.55
67 2000/1/1 1:07 7.55
68 2000/1/1 1:08 7.56
69 2000/1/1 1:09 7.56
70 2000/1/1 1:10 7.56
71 2000/1/1 1:11 7.55
72 2000/1/1 1:12 7.56
73 2000/1/1 1:13 7.56
74 2000/1/1 1:14 7.56
75 2000/1/1 1:15 7.55
76 2000/1/1 1:16 7.56
77 2000/1/1 1:17 7.56
78 2000/1/1 1:18 7.55
79 2000/1/1 1:19 7.56
80 2000/1/1 1:20 7.56
81 2000/1/1 1:21 7.56
82 2000/1/1 1:22 7.56
83 2000/1/1 1:23 7.56
84 2000/1/1 1:24 7.55
85 2000/1/1 1:25 7.56
86 2000/1/1 1:26 7.55
87 2000/1/1 1:27 7.55
88 2000/1/1 1:28 7.56
89 2000/1/1 1:29 7.56
90 2000/1/1 1:30 7.55
91 2000/1/1 1:31 7.56
92 2000/1/1 1:32 7.56
93 2000/1/1 1:33 7.56
94 2000/1/1 1:34 7.56
95 2000/1/1 1:35 7.56
96 2000/1/1 1:36 7.55
97 2000/1/1 1:37 7.56
98 2000/1/1 1:38 7.56
99 2000/1/1 1:39 7.55
100 2000/1/1 1:40 7.56
101 2000/1/1 1:40 0.05
102 2000/1/1 1:41 0.05
103 2000/1/1 1:42 0.07
104 2000/1/1 1:43 0.07
105 2000/1/1 1:44 0.05
106 2000/1/1 1:45 0.05
107 2000/1/1 1:46 0.05
108 2000/1/1 1:47 0.05
109 2000/1/1 1:48 0.05
110 2000/1/1 1:49 0.05
111 2000/1/1 1:50 0.05
112 2000/1/1 1:51 0.05
113 2000/1/1 1:52 0.05
114 2000/1/1 1:53 0.05
115 2000/1/1 1:54 0.05
116 2000/1/1 1:55 0.05
117 2000/1/1 1:56 0.05
118 2000/1/1 1:57 0.05
119 2000/1/1 1:58 0.05
120 2000/1/1 1:59 0.05
121 2000/1/1 2:00 0.05
122 2000/1/1 2:01 0.05
123 2000/1/1 2:02 0.05
124 2000/1/1 2:03 0.05
125 2000/1/1 2:04 0.05
126 2000/1/1 2:05 0.05
127 2000/1/1 2:06 0.05
128 2000/1/1 2:07 0.05
129 2000/1/1 2:08 0.05
130 2000/1/1 2:09 0.05
131 2000/1/1 2:10 0.05
132 2000/1/1 2:11 0.05
133 2000/1/1 2:12 0.05
134 2000/1/1 2:13 0.05
135 2000/1/1 2:14 0.05
136 2000/1/1 2:15 7.74
137 2000/1/1 2:16 7.91
138 2000/1/1 2:17 7.88
139 2000/1/1 2:18 7.8
140 2000/1/1 2:19 7.73
141 2000/1/1 2:20 7.67
142 2000/1/1 2:21 7.63
143 2000/1/1 2:22 7.61
144 2000/1/1 2:23 7.59
145 2000/1/1 2:24 7.57
146 2000/1/1 2:25 7.56
147 2000/1/1 2:26 7.56
148 2000/1/1 2:27 7.55
149 2000/1/1 2:28 7.55
150 2000/1/1 2:29 7.54
151 2000/1/1 2:30 7.53
152 2000/1/1 2:31 7.54
153 2000/1/1 2:32 7.54
154 2000/1/1 2:33 7.53
155 2000/1/1 2:34 7.53
156 2000/1/1 2:35 7.53
157 2000/1/1 2:36 7.52
158 2000/1/1 2:37 7.52
159 2000/1/1 2:38 7.53
160 2000/1/1 2:39 7.52
161 2000/1/1 2:40 7.52
162 2000/1/1 2:41 7.52
163 2000/1/1 2:42 7.52
164 2000/1/1 2:43 7.52
165 2000/1/1 2:44 7.53
166 2000/1/1 2:45 7.52
167 2000/1/1 2:46 7.52
168 2000/1/1 2:47 7.52
169 2000/1/1 2:48 7.53
170 2000/1/1 2:49 7.52
171 2000/1/1 2:50 7.53
172 2000/1/1 2:51 7.53
173 2000/1/1 2:52 7.54
174 2000/1/1 2:53 7.55
175 2000/1/1 2:54 7.52
176 2000/1/1 2:55 7.53
177 2000/1/1 2:56 7.55
178 2000/1/1 2:57 7.54
179 2000/1/1 2:58 7.53
180 2000/1/1 2:59 7.54
181 2000/1/1 3:00 7.53
182 2000/1/1 3:01 7.55
183 2000/1/1 3:02 7.53
184 2000/1/1 3:03 7.54
185 2000/1/1 3:04 7.55
186 2000/1/1 3:05 7.54
187 2000/1/1 3:06 7.53
188 2000/1/1 3:07 7.54
189 2000/1/1 3:08 7.55
190 2000/1/1 3:09 7.53
191 2000/1/1 3:10 7.54
192 2000/1/1 3:11 7.52
193 2000/1/1 3:12 7.55
194 2000/1/1 3:13 7.55
195 2000/1/1 3:14 7.55
196 2000/1/1 3:15 7.53
197 2000/1/1 3:16 7.52
198 2000/1/1 3:17 7.53
199 2000/1/1 3:18 7.53
200 2000/1/1 3:19 7.55
201 2000/1/1 3:20 7.54
202 2000/1/1 3:21 7.53
203 2000/1/1 3:22 7.54
204 2000/1/1 3:23 7.53
205 2000/1/1 3:24 7.54
206 2000/1/1 3:25 7.53
207 2000/1/1 3:26 7.54
208 2000/1/1 3:27 7.53
209 2000/1/1 3:28 7.55
210 2000/1/1 3:29 7.55
211 2000/1/1 3:30 7.54
212 2000/1/1 3:31 7.55
213 2000/1/1 3:32 7.54
214 2000/1/1 3:33 7.53
215 2000/1/1 3:34 7.53
216 2000/1/1 3:35 7.53
217 2000/1/1 3:36 7.55
218 2000/1/1 3:37 7.53
219 2000/1/1 3:38 7.54
220 2000/1/1 3:39 7.55
221 2000/1/1 3:40 7.55
222 2000/1/1 3:41 7.53
223 2000/1/1 3:42 7.53
224 2000/1/1 3:43 7.53
225 2000/1/1 3:44 7.55
226 2000/1/1 3:45 7.53
227 2000/1/1 3:46 7.55
228 2000/1/1 3:47 7.53
229 2000/1/1 3:48 7.55
230 2000/1/1 3:49 7.53
231 2000/1/1 3:50 7.54
232 2000/1/1 3:51 7.54
233 2000/1/1 3:52 7.55
234 2000/1/1 3:53 7.53
235 2000/1/1 3:54 7.55
236 2000/1/1 3:55 7.54
237 2000/1/1 3:56 7.55
238 2000/1/1 3:57 7.55
239 2000/1/1 3:58 7.54
240 2000/1/1 3:59 7.54
241 2000/1/1 4:00 7.55
242 2000/1/1 4:01 7.55
243 2000/1/1 4:02 7.54
244 2000/1/1 4:03 7.54
245 2000/1/1 4:04 7.53
246 2000/1/1 4:05 7.54
247 2000/1/1 4:06 7.54
248 2000/1/1 4:07 7.55
249 2000/1/1 4:08 7.55
250 2000/1/1 4:09 7.55
251 2000/1/1 4:10 7.55
252 2000/1/1 4:11 7.54
253 2000/1/1 4:12 7.55
254 2000/1/1 4:13 7.54
255 2000/1/1 4:14 7.55
256 2000/1/1 4:15 7.55
257 2000/1/1 4:16 7.55
258 2000/1/1 4:17 7.54
259 2000/1/1 4:18 7.55
260 2000/1/1 4:19 7.54
261 2000/1/1 4:20 7.55
262 2000/1/1 4:21 7.55
263 2000/1/1 4:22 7.55
264 2000/1/1 4:23 7.55
265 2000/1/1 4:24 7.55
266 2000/1/1 4:25 7.55
267 2000/1/1 4:26 7.55
268 2000/1/1 4:27 7.55
269 2000/1/1 4:28 7.55
270 2000/1/1 4:29 7.55
271 2000/1/1 4:30 7.55
272 2000/1/1 4:31 7.55
273 2000/1/1 4:32 7.55
274 2000/1/1 4:33 7.55
275 2000/1/1 4:34 7.55
276 2000/1/1 4:35 7.55
277 2000/1/1 4:36 7.55
278 2000/1/1 4:37 7.55
279 2000/1/1 4:38 7.55
280 2000/1/1 4:39 7.55
281 2000/1/1 4:40 7.55
282 2000/1/1 4:41 0.05
283 2000/1/1 4:42 0.05
284 2000/1/1 4:43 0.05
285 2000/1/1 4:44 0.05
286 2000/1/1 4:45 0.05
287 2000/1/1 4:46 0.05
288 2000/1/1 4:47 0.05
289 2000/1/1 4:48 0.05
290 2000/1/1 4:49 0.05
291 2000/1/1 4:50 0.05
292 2000/1/1 4:51 0.05
293 2000/1/1 4:52 0.05
294 2000/1/1 4:53 0.05
295 2000/1/1 4:54 0.05
296 2000/1/1 4:55 0.05
297 2000/1/1 4:56 0.05
298 2000/1/1 4:57 0.05
299 2000/1/1 4:58 0.05
300 2000/1/1 4:59 0.05

現在迄に試みた事

方形波のトリガとなる閾値は解っていますので、それを超えているカラムに
追加列を追加して時間を入れてみましたが、これでは波形が長い時には次の分や時間に
跨ってしまい、group byのKeyになりませんでした。

ナンバリングでも構わないのですが、当方のスキルでは難しく…
また後で確認するときに必要なので、出来れば時間で括りたいと考えています。

考え方でも構いませんので御教授下さい。

補足情報(FW/ツールのバージョンなど)

python 3.6.5
numpy 1.14.3
pandas 0.23.0

OS Windows10 64bit

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

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

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

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

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

guest

回答1

0

ベストアンサー

単に、CSVデータに切り出すだけであるのなら

Python

1import pandas as pd 2 3df = pd.read_csv('sample_data.csv', 4 parse_dates=['Time'], 5 index_col='NO.' 6) 7 8threshold = 7 9 10# 立ち上がりエッジにてデータを分割 11df['group'] = ((df.A.shift() < threshold) & (df.A > threshold)).cumsum() 12# 分割したデータ毎にループ 13for n, df in df.groupby('group'): 14 # 閾値以上のデータのみをCSVに書き出す 15 df[df.A > threshold].drop(columns='group').to_csv("data_{}.csv".format(n))

こんな感じで良いかと思います

やっていることはコメントに書いている通り。

  1. 立ち上がりエッジの箇所でのデータ分割用に"group"列を生成
  2. "group"列をによりgroupby()を行い、グループ毎にループ処理
  3. グループ内のデータの内、前半の閾値データ以上のデータのみをCSVに書き出す

です。

質問にあがっているデータの場合、group:0 のデータは空となります。必要であれば emptyのチェックは入れてください

投稿2018/10/01 07:15

編集2018/10/01 07:25
magichan

総合スコア15898

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

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

atsunofu

2018/10/01 08:12

コメントありがとうございます、ナンバリングでの出力が出来ました。 df['group'] = ((df.A.shift() < threshold) & (df.A > threshold)).cumsum() で 立ち上がりの回数をカウントしているのですね。 立ち下りの回数も加えてカウントするには df['group'] = (((df.A.shift() < threshold) & (df.A > threshold))| ((df.A.shift() > threshold) & (df.A < threshold))).cumsum() かと考えたのですがこれだとgroupの値が全て0になってしまいました。 どの様なLogicなのか教えていただければ幸いです。
magichan

2018/10/01 08:23 編集

立ち下りの回数も加えてカウントするには df['group'] = (((df.A.shift() < threshold) & (df.A > threshold)) | ((df.A.shift() > threshold) & (df.A < threshold))).cumsum() かと考えたのですが・・・ これで問題ないと思います。 上手くいきませんか?
magichan

2018/10/01 08:47 編集

どの様なLogicなのか・・・。 まず、 "df.A.shift()" は一つ上の行の "A" 値となりますので、 ((df.A.shift() < threshold) & (df.A > threshold) Aの値が 閾値より大きく、一つ上の行のA値が閾値より小さい場合のみ "True", それ以外の行は "False" となります。(つまり 立ち上がりエッジのみ True) cumsum() は累積和を求めるメソッドとなります。(小計をもとめるやつです) Booleanは "True" は "1"、"False" は "0" と扱いますので cumsum()を行うことで、True の数の小計を取っていくという動作となり、結果的に 立ち上がりエッジにて数がインクリメントしていきますので、これを group 列に格納しております。
atsunofu

2018/10/01 09:12

当方のデータが上書きされており、結果が更新されておりませんでした。申し訳ありません。 立ち下りの回数も加えてのカウントが出来ました。 今後時系列データの更新に対応出来る様に改善を進めて行きたいと思います。 ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問