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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Q&A

解決済

3回答

761閲覧

【Python】csvファイルを加工して5分おきのデータを0埋めしたいです。

Sarada

総合スコア4

Python 3.x

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

0グッド

0クリップ

投稿2023/03/29 03:03

実現したいこと

5分置きのデータを0埋めしたいです。

前提

現在以下のようなcsvファイルがあります。
A,Time,num
"A",2023-02-15 23:55:00,1
"A",2023-02-15 23:50:00,2
"A",2023-02-15 23:40:00,3
"A",2023-02-15 23:30:00,2
"A",2023-02-15 23:25:00,1
"A",2023-02-15 23:10:00,1
"A",2023-02-15 23:00:00,4
"A",2023-02-15 22:55:00,2
"A",2023-02-15 22:45:00,1

csvの中身として、Timeは5分おきに記録され、numが0でなければ数が記録され、0ならその時間は飛ばされるようになっています。
このデータを成形し、numが0のデータも作成したいです。
上に掲載したcsvは最終的に以下のような形にしたいです。
A,Time,num
"A",2023-02-15 23:55:00,1
"A",2023-02-15 23:50:00,2
"A",2023-02-15 23:45:00,0
"A",2023-02-15 23:40:00,3
"A",2023-02-15 23:35:00,0
"A",2023-02-15 23:30:00,2
"A",2023-02-15 23:25:00,1
"A",2023-02-15 23:20:00,0
"A",2023-02-15 23:15:00,0
"A",2023-02-15 23:10:00,1
"A",2023-02-15 23:05:00,0
"A",2023-02-15 23:00:00,4
"A",2023-02-15 22:55:00,2
"A",2023-02-15 23:50:00,0
"A",2023-02-15 22:45:00,1

また、Timeの期間が若干複雑で連続にはなっていないです。
記録があるのは1/13~1/15,2/13~2/15となっており、間の1/16~2/12は無視したいです(この期間の0埋めは不要)。
注文が多いですが、よろしくお願い致します。

該当のソースコード

以下のコードを試してみたりしたのですが、解決には至りませんでした。

python

1import datetime 2 3date1 = datetime.datetime(year=2022, month=1, day=13, hour=00, minute=0) 4date2 = datetime.datetime(year=2022, month=1, day=15, hour=23, minute=55) 5delta = datetime.timedelta(minutes=5) 6 7while date1 < date2: 8 print(date1) 9 date1 = date1 + delta

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

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

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

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

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

guest

回答3

0

ベストアンサー

1/13の0:00:00~1/15の23:55:00・2/13の0:00:00~2/15の23:55:00と、この期間内であれば全ての時間帯での5分おきのデータを作成したい

python

1import pandas as pd 2from datetime import timedelta 3 4df = pd.read_csv('data.csv', parse_dates=['Time']) 5cols = df.columns 6 7# 1/13 0:00:00~1/15 23:55:00 と 2/13 0:00:00~2/15 23:55:00 のインデックス(5分毎)を作成 8first_day, last_day = df['Time'].min().date(), df['Time'].max().date() + timedelta(days=1) 9time_idx = pd.date_range(first_day, '2023-01-16', freq='5min', inclusive='left') 10time_idx = time_idx.union(pd.date_range('2023-02-15', last_day, freq='5min', inclusive='left')) 11 12# reset datetime index 13dfx = df.set_index('Time').reindex(time_idx).rename_axis('Time').reset_index()[cols] 14 15# fullfill NaN 16dfx['A'] = dfx['A'].fillna('A').map('"{}"'.format) 17dfx['num'] = dfx['num'].fillna(0, downcast='infer') 18 19# save to CSV file 20dfx.to_csv('filled_data.csv', index=False, quoting=3)

投稿2023/03/29 03:43

編集2023/03/29 07:34
melian

総合スコア19618

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

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

Sarada

2023/03/29 06:51 編集

回答有り難うございます。 追加でもう二つ質問させてください。 1つ目:Timeを昇順に並べ替えようと思い、melianさんが書いてくださったコードの10行目、11行目の間に dfx = dfx.sort_values(Time)と書いたのですがこれで問題ありませんよね? 2つ目:データの記録があるのは1/13~1/15,2/13~2/15の6日間なんですが、一番初めのデータの記録は1/13の2:20:00というデータです。 1/13の0:00:00~1/15の23:55:00・2/13の0:00:00~2/15の23:55:00と、この期間内であれば全ての時間帯での5分おきのデータを作成したいのですが、これはどうすればよいでしょうか…? 質問が多くて大変申し訳ありません、是非とも回答よろしくお願い致します。
melian

2023/03/29 06:20

> 1つ目 はい、それで構いませんが、 dfx = df.set_index('Time').resample('5min').last().iloc[::-1].reset_index() の、.iloc[::-1] を削る方がよいかと思います。resample の時点で昇順にソートされていますので。 dfx = df.set_index('Time').resample('5min').last().reset_index() 2つ目については回答を修正しますので、しばらくお待ち下さい。
Sarada

2023/03/29 06:53

ありがとうございます。 宜しくお願い致します。
melian

2023/03/29 07:24

修正しました。お試し下さい。
Sarada

2023/03/29 09:09

回答ありがとうございました。 本当に助かりました。 無事作成できました。 念のための確認ですが、melianさんに書いていただいたコードの10行目の「'2023-02-15'」の部分ですが、ここは'2023-02-13'にすれば問題ありませんよね?
melian

2023/03/29 09:20

ああ、ごめんなさい、おっしゃる通り 2023-02-13 です。
Sarada

2023/03/29 23:32

ありがとうございます。
guest

0

あなたのようなウェブサイトを持つことは、あなたにとってメリットがあると思います。 皆さんと一緒に感情を表現できてうれしいです。 このゲームは非常に興味深いので、非常に熱心です。 私と一緒にこの体験に参加してください: 1v1 lol

投稿2023/04/18 04:37

vixenclose

総合スコア8

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

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

0

pandasを使います。
date_rangeで対象期間の0データ行を生成して元のデータと結合するとよいです。

Python

1import pandas as pd 2from io import StringIO 3 4s = """A,Time,num 5"A",2023-02-15 23:55:00,1 6"A",2023-02-15 23:50:00,2 7"A",2023-02-15 23:40:00,3 8"A",2023-02-15 23:30:00,2 9"A",2023-02-15 23:25:00,1 10"A",2023-02-15 23:10:00,1 11"A",2023-02-15 23:00:00,4 12"A",2023-02-15 22:55:00,2 13"A",2023-02-15 22:45:00,1""" 14df = pd.read_csv(StringIO(s), parse_dates=['Time']) 15 16# 対象期間。右端(終了)部分は含まない 17d1 = pd.date_range('2023-01-13', '2023-01-16', freq='5min', inclusive='left') 18d2 = pd.date_range('2023-02-13', '2023-02-16', freq='5min', inclusive='left') 19dt = pd.Series(d1.append(d2), name='Time') 20 21# 対象期間と結合。NaNは適切な初期値をセット 22df = df.merge(dt, on='Time', how='right', suffixes=['', '_y']) 23df['A'] = df['A'].fillna('A') 24df['num'] = df['num'].fillna(0).astype(int) 25 26# Timeの降順に 27df = df.sort_values(['Time'], ascending=False) 28 29print(df.head(15) 30df.to_csv('ret.csv', index=False) 31""" 32 A Time num 331727 A 2023-02-15 23:55:00 1 341726 A 2023-02-15 23:50:00 2 351725 A 2023-02-15 23:45:00 0 361724 A 2023-02-15 23:40:00 3 371723 A 2023-02-15 23:35:00 0 381722 A 2023-02-15 23:30:00 2 391721 A 2023-02-15 23:25:00 1 401720 A 2023-02-15 23:20:00 0 411719 A 2023-02-15 23:15:00 0 421718 A 2023-02-15 23:10:00 1 431717 A 2023-02-15 23:05:00 0 441716 A 2023-02-15 23:00:00 4 451715 A 2023-02-15 22:55:00 2 461714 A 2023-02-15 22:50:00 0 471713 A 2023-02-15 22:45:00 1) 48"""

投稿2023/03/29 03:49

can110

総合スコア38233

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問