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

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

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

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

pandas

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

Q&A

解決済

4回答

2697閲覧

【Python】1分単位で記録された1年分の時系列データを週ごとに分割し出力したい

heisan

総合スコア2

Python

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

pandas

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

0グッド

0クリップ

投稿2021/12/12 07:11

編集2021/12/12 07:38

前提

・言語:Python3系
・開発環境:Anaconda
・IDE:Spyder
でデータ分析を行っています。

〇扱うデータの詳細
・1分単位で記録された時系列データ(「2021-12-12 15:59」のような形で記録)
・1年分のデータが一つのファイルに保存されている
・各列ごとに温度などの項目が測定されている

###データの概形
DATE     Tempreture1 Tempreture2 SysStatus
2020/5/1 0:00:00    18.75 17.91 0
2020/5/1 0:01:00    18.76 17.90 0
2020/5/1 0:02:00    18.76 17.91 0
2020/5/1 0:03:00    18.76 17.90 0
2020/5/1 0:04:00    18.77 17.91 1
2020/5/1 0:05:00    18.75 17.90 1


###実現したいこと

①(必須)上記のような形式の1年分の時系列データを週ごとに分割し、それぞれの週でcsvファイルとして出力したい。
②(可能であれば)週ごとのデータは日曜日から月曜日のデータを一週間として分割したい。

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

問題が発生しているというよりは、あれこれ調べてみても週ごとの合計値などの集計方法(resampleメソッドなど)のみが取り上げられており、有効な方法が思いつかないため、ご助力いただきたいと考えています。

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

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

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

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

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

melian

2021/12/12 07:32

DATE と TIME は別々の列なのでしょうか?
heisan

2021/12/12 07:37

ありがとうございます。 情報が曖昧で申し訳ございません。実際のデータでは別々の列なのですが、ご回答いただく際には1列の時系列データとして認識していただいて問題ありません。 曖昧さ回避のため、1列に修正します。
tatsu99

2021/12/12 08:13

①データは日付/時刻の昇順に並んでいる前提で良いのでしょうか。 ②出力形式は DATE,Tempreture1,Tempreture2,SysStatus 2020/5/1 0:00:00,18.75,17.91,0 2020/5/1 0:01:00,18.76,17.90,0 ですか。 それとも以下のようにDATEとTIMEは別項目ですか。 DATE,TIME,Tempreture1,Tempreture2,SysStatus 2020/5/1,0:00:00,18.75,17.91,0 2020/5/1,0:01:00,18.76,17.90,0 ③出力ファイル名は data1.csv data2.csv のように連番でよいですか。 それとも、何かこうしたいというものがあるのでしょうか。 (ファイル名に最初の日付/時刻を組み込みたい等)
heisan

2021/12/13 14:25

ありがとうございます。 本件に関しては、別の方のご回答で解説いたしましたので、閉めさせていただきます。 別の機会があればまたよろしくお願いいたします。
guest

回答4

0

df['DATE']のdtypeがdatetime64[ns]型なら以下でできます。
df['DATE']のdtypeがstrの場合は、to_datetimeを使ってdatetime64[ns]型に変換しておいてください。

python

1df['YEAR_WEEK'] = df['DATE'].dt.strftime('%Y_%U') 2year_weeks = sorted(list(set(df['YEAR_WEEK']))) 3for yw in year_weeks: 4 df[df['YEAR_WEEK']==yw].iloc[:,:4].to_csv(yw + '.csv', index_col=0)

投稿2021/12/12 08:29

ppaul

総合スコア24666

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

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

heisan

2021/12/13 14:24

ご回答ありがとうございました。申し訳ありませんが、今回はより回答の早かった方をベストアンサーとさせていただきました。 また機会があればよろしくお願いいたします。
guest

0

pandas.Grouperを使って一週間単位でグループ化すればできそうです。

python

1for dt, dfs in df.groupby(pd.Grouper(key='date', freq='W-Sun')): 2 dfs.to_csv(dt.strftime('%Y%m%d.csv'), index=False)

上記でdtは、週の最後の日になっているので、その日付をcsvのファイル名にしています。

freq='W-Sun'だと、月曜日始まりの日曜日終わりです。
日曜日始まりの土曜日終わりだとfreq='W-Sat'になります。

投稿2021/12/12 08:19

編集2021/12/12 08:39
bsdfan

総合スコア4560

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

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

heisan

2021/12/13 14:24

ご回答ありがとうございました。申し訳ありませんが、今回はより回答の早かった方をベストアンサーとさせていただきました。 また機会があればよろしくお願いいたします。
guest

0

ベストアンサー

1分刻みで1年分のデータ(2020/5/1 00:00:00 - 2021/4/30 23:59:00)を適当に作成して試してみました。出力する CSV ファイルの名前は「{日曜日の日付}_{次の土曜日の日付}.csv」にしています。2020/5/1 は金曜日ですので、最初の CSV ファイルは "2020-05-01_2020-05-02.csv" になります。

python

1import pandas as pd 2import numpy as np 3from numpy.random import default_rng 4 5pd.options.display.float_format="{:.2f}".format 6 7# dataframe for testing 8rg = default_rng() 9N = 365 * 24 * 60 10df = pd.DataFrame({ 11 'DATE': pd.date_range(start='2020/5/1', periods=N, freq='min'), 12 'Tempreture1': rg.uniform(10.0, 25.0, N), 13 'Tempreture2': rg.uniform(10.0, 25.0, N), 14 'SysStatus': rg.integers(0, 2, N), 15}) 16 17# 毎週日曜日 00:00:00 で分割 18import datetime 19split_points = ( 20 (df['DATE'].dt.weekday == 6) & 21 (df['DATE'].dt.time == datetime.time(0, 0))).cumsum() 22 23df_list = [dfs for _, dfs in df.groupby(split_points)] 24 25# save to CSV files 26for dfs in df_list: 27 begin = dfs['DATE'].min().date() 28 end = dfs['DATE'].max().date() 29 dfs.to_csv(f'{begin}_{end}.csv', index=False)

投稿2021/12/12 08:08

melian

総合スコア19749

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

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

heisan

2021/12/13 14:19

ご回答ありがとうございます。とても分かりやすい回答でもっともはやくご回答いただけたためベストアンサーとさせていただきました。 改めてありがとうございました!
guest

0

まずは1日ごとの集計のコードを書いてみましょう
それはできるでしょうか。

それがきちんとできたなら、
あとはそれを週ごとにまとめてしまうだけ、となります。

投稿2021/12/12 07:19

y_waiwai

総合スコア87774

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

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

heisan

2021/12/12 07:24

ご回答ありがとうございます。 y_waiwai様が仰られているのは、数値の合計や平均をするというお話なのでしょうか? 私が行いたいのは、1分単位のデータのまま年次のデータを週次に分割したいということなのですが、もし私と同じ意味でお話しされているのであれば、もう少し詳細に教えていただくことは可能でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問