69129


時系列で、１時間ごとに以下のような形式でデータの入っているものがあります。

[code]

    datetime               on_off
    2020-05-31 11:31                                      　　　　　　　　　  00000000000000000000000000000
    2020-05-31 12:00       000000000000000000000000000000000000000000000000000000000000
    2020-06-01 13:00       111111000100000111100000000000000000000000000000000000000000
    2020-06-03 14:18                         　　　　　  000000000000000000000000000000000000000000
    2020-06-05 15:00       000000000000000000000000000000000000000000000000000000000000
    2020-06-06 03:00       000000000000000000000000000000000000000000000000000000000000
    
[/code]

前提条件として、

・欠損している箇所には空白もNaNも入っておらず、値として入ってるのは数字が始まる部分から  
・「on／off」データは一行に60個あるのが正常なもの  
・datetimeで「11:31」のように途中から始まってる場合は[on/off]列は31分から始まるので29個値が並ぶ

出したい形としては、

[code]

    2020-04-13 11:31:00    0
    2020-04-13 11:32:00    0
    2020-04-13 11:33:00    0
    2020-04-13 11:34:00    0
    [省略]
    2020-04-13 11:59:00    0
    
[/code]

のように毎分１レコードのように対応させたいのです。

[code]

    start_at, end_at = df.datetime.min(), df.datetime.max()
    res = df.reindex(pd.date_range(start_at, end_at, freq="T"))
    
[/code]

で、まず分毎のデータを作成し、

[code]

    df["on_off"].str.split('')
    list_split =[[a for a in y if a != '']for y in y]
    
[/code]

でリスト化して結合することで対応しようとしたのですが、日にち自体も歯抜けしている為に二つの数が合わず、  
結合ができませんでした。

このようなデータに対してアプローチ自体が間違えてるのでしょうか・・・。  
何卒よろしくお願いします。


CC BY-SA 4.0
2020-07-30T12:38:48.660
69122
2020-07-31T02:39:18.000
2020-07-30T15:47:22.510
3060
41287
question
python python3 pandas
時系列データで、時間の歯抜けと欠損のあるデータを処理したい


例えばデータを以下のように`CSV`にしたとすると：

[code]

    datetime,on_off
    2020-05-31 11:31,                               00000000000000000000000000000
    2020-05-31 12:00,000000000000000000000000000000000000000000000000000000000000
    2020-06-01 13:00,111111000100000111100000000000000000000000000000000000000000
    2020-06-03 14:18,                  000000000000000000000000000000000000000000
    2020-06-05 15:00,000000000000000000000000000000000000000000000000000000000000
    2020-06-06 03:00,000000000000000000000000000000000000000000000000000000000000
    
[/code]

以下のようなプログラムでリスト化出来るでしょう。  
(元データの形式(CSV/TXTファイルまたはPandas.DataFrame等)が違えば、それに応じて色々変わりますが)

[code]

    from datetime import datetime, timedelta
    import csv
    from pprint import pprint
    
    with open('status.csv', 'r', encoding='utf-8', newline='') as f:
        reader = csv.reader(f)
        csvdata = [row for row in reader]
    
    csvdata.pop(0)  ## 項目名行削除
    
    minuteonofflist = []
    for tm, sts in csvdata:
        onoffs = list(sts.strip())
        datalen = len(onoffs)
        basetime = datetime.strptime(tm, '%Y-%m-%d %H:%M')
        timelist = [(basetime + timedelta(minutes=i)).strftime('%Y-%m-%d %H:%M:%S') for i in range(datalen)]
        minuteonofflist.extend([[t,f] for t,f in zip(timelist, onoffs)])
    
    pprint(minuteonofflist)
    
[/code]

結果は以下に。

[code]

    [['2020-05-31 11:31:00', '0'],
     ['2020-05-31 11:32:00', '0'],
     ['2020-05-31 11:33:00', '0'],
     ['2020-05-31 11:34:00', '0'],
     ['2020-05-31 11:35:00', '0'],
    ～省略～
     ['2020-06-06 03:55:00', '0'],
     ['2020-06-06 03:56:00', '0'],
     ['2020-06-06 03:57:00', '0'],
     ['2020-06-06 03:58:00', '0'],
     ['2020-06-06 03:59:00', '0']]
    
[/code]

* * *

質問ではデータの有る部分については要望が出ていますが、データの無い部分についてはどうするか書かれていませんね。  
以下のような選択肢が考えられます。

  * データの無い部分のレコードは不要
  * データの無い部分でもレコードを作成する  
on/off状態のデータは以下のいずれか

    * 空文字列
    * 空白1文字
    * on/offどちらか固定
    * 最後のデータの状態を引き継ぐ
    * 最後のデータと次の最初のデータの間で変化等を補完する


CC BY-SA 4.0
2020-07-30T17:32:55.873
69129
2020-07-31T02:39:18.000
2020-07-31T02:39:18.000
26370
26370
69122
answer