前提・実現したいこと
時間粒度が1時間のデータが3ヶ月分あります(時間の列はインデックス)。
時間 | data1 | data2 |
---|---|---|
2015-04-01 00:00:00 | 1 | 10 |
2015-04-01 01:00:00 | 2 | 20 |
2015-04-01 02:00:00 | 3 | 30 |
: | : | : |
2015-04-01 23:00:00 | 4 | 40 |
2015-04-02 00:00:00 | 5 | 50 |
: | : | : |
2015-06-30 22:00:00 | 6 | 60 |
2015-06-30 23:00:00 | 7 | 70 |
このデータフレームで、各月ごとに同じ日のデータを一つの塊としてシャッフルしたい。
同じ日のデータを一つの塊にするというのは、例えば、4月1日内の1時と5時のデータをシャッフルなどはせず、0時から23時までを1つの塊とし、4月1日の塊と4月5日の塊や4月2日の塊と4月10日の塊をシャッフルしたりするということ。
4月のデータは4月内だけで、5月のデータは5月内だけでシャッフルする。
最終的にはシャッフルしたデータを1つのリストに格納したい。
該当のソースコード
import pandas as pd import itertools import numpy as np csv = pd.read_csv('sample.csv', parse_dates=[0], index_col=0) data1_m4=[ list(csv.loc['2015-04-01 00:00:00':'2015-04-01 23:00:00', 'data1']),list(csv.loc['2015-04-02 00:00:00':'2015-04-02 23:00:00', 'data1']),list(csv.loc['2015-04-02 00:00:00':'2015-04-02 23:00:00', 'data1']),list(csv.loc['2015-04-03 00:00:00':'2015-04-03 23:00:00', 'data1']),list(csv.loc['2015-04-04 00:00:00':'2015-04-04 23:00:00', 'data1']),list(csv.loc['2015-04-05 00:00:00':'2015-04-02 23:00:00', 'data1']),list(csv.loc['2015-04-06 00:00:00':'2015-04-06 23:00:00', 'data1']) ] np.random.shuffle(data1_m4) a = list(itertools.chain.from_iterable(data1_m4)) #ここで二次元リストを一次元リストにする
試したこと
ここでは4月の中の6日分しか記述していないですが、本来は30日分書きます。
これを他の月でもやり、最後に3ヶ月のリストを1つのリストに結合すれば一応はやりたいことが達成できます。
しかし、このやり方はかなり面倒なので何か簡単にできる方法はないでしょうか。
import pandas as pd import itertools import numpy as np csv = pd.read_csv('sample.csv', parse_dates=[0], index_col=0) df=csv.resample('H').mean() #元のデータは30分刻みのデータなのでここで1時間ごとのデータにしています #ここから下は全く同じ def shuffle_days(df_month): groups = [df for _, csv1 in df_month.groupby('D')] random.shuffle(groups) return pd.concat(groups).reset_index(drop=True) df = df.reset_index() df['Y'] = df['時間'].dt.year df['M'] = df['時間'].dt.month df['D'] = df['時間'].dt.day df = df.groupby(['Y', 'M']).apply(shuffle_days) df = df.drop(['Y', 'M', 'D'], axis=1).reset_index(drop=True) print(df)
一応csvファイルの時間の表記も載せておきます。元のデータはcsv上でこのような形式になっています。
時間 | data1 | data2 |
---|---|---|
2015/4/1 1:00:00 | 1 | 10 |
2015/4/1 2:00:00 | 2 | 20 |
: | : | : |
### 補足情報(FW/ツールのバージョンなど) |
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/14 02:32
2020/11/14 03:18 編集
2020/11/14 04:04
2020/11/14 05:30
2020/11/14 05:57
2020/11/14 06:30
2020/11/14 07:22
2020/11/14 08:26
2020/11/14 09:11
2020/11/14 09:19
2020/11/15 01:53