Pandas中時間序列缺失如何處理?


  補齊時間序列

  Table of Contents

  時間索引缺失如何補齊?

  需要補齊的時間序列不是索引?

  處理數據時我們總會遇到令人頭疼的時間序列,一方面我們遇到看着是時間又不是時間格式的數據需要我們將其轉化為時間格式。另一方面就是這次討論的時間序列缺失的問題。

  處理時間格式

  准備我們的數據:

  數據地址

  import numpy as np

  import pandas as pd

  時間索引缺失如何補齊?

  # 數據可以自行下載

  file = r'timeseries.csv'

  df = pd.read_csv(file, index_col=0)

  df

  A  B  C  D

  2019/10/11 0:00  28  14  25  15

  2019/10/11 1:00  11  11  14  26

  2019/10/11 3:00  15  12  14  17

  2019/10/11 4:00  16  10  14  12

  2019/10/11 6:00  24  11  13  26

  2019/10/11 8:00  21  29  29  22

  2019/10/11 9:00  18  18  17  25

  明顯時間索引有缺失的情況,我們可以使用reindex()來處理:

  確保索引是時間格式

  得到完整的時間序列

  reindex補齊

  為什么要確保時間格式?我們生成的序列要保證時間完整只能使用時間格式,除非自己手動實現復雜的算法。reindex要求兩者數據一致,否則你會得到全NAN數據。

  df.index

  Index(['2019/10/11 0:00', '2019/10/11 1:00', '2019/10/11 3:00',

  '2019/10/11 4:00', '2019/10/11 6:00', '2019/10/11 8:00',

  '2019/10/11 9:00'],

  dtype='object')

  # 創建完整的時間格式

  t_index = pd.date_range('2019-10-11 00:00:00', '2019-10-11 09:00:00', freq='H')

  df.reindex(t_index)

  A  B  C  D

  2019-10-11 00:00:00  NaN  NaN  NaN  NaN

  2019-10-11 01:00:00  NaN  NaN  NaN  NaN

  2019-10-11 02:00:00  NaN  NaN  NaN  NaN

  2019-10-11 03:00:00  NaN  NaN  NaN  NaN

  2019-10-11 04:00:00  NaN  NaN  NaN  NaN

  2019-10-11 05:00:00  NaN  NaN  NaN  NaN

  2019-10-11 06:00:00  NaN  NaN  NaN  NaN

  2019-10-11 07:00:00  NaN  NaN  NaN  NaN

  2019-10-11 08:00:00  NaN  NaN  NaN  NaN

  2019-10-11 09:00:00  NaN  NaN  NaN  NaN

  由於CSV文本文件,我們也看到數據類型不對的情況下,全NaN的結果。

  重新獲取數據,並實現時間格式解析

  df = pd.read_csv(file, parse_dates=[0], index_col=0)

  df

  A  B  C  D

  2019-10-11 00:00:00  28  14  25  15

  2019-10-11 01:00:00  11  11  14  26

  2019-10-11 03:00:00  15  12  14  17

  2019-10-11 04:00:00  16  10  14  12

  2019-10-11 06:00:00  24  11  13  26

  2019-10-11 08:00:00  21  29  29  22

  2019-10-11 09:00:00  18  18  17  25

  df.index # 解析成時間格式了

  DatetimeIndex(['2019-10-11 00:00:00', '2019-10-11 01:00:00',

  '2019-10-11 03:00:00', '2019-10-11 04:00:00',

  '2019-10-11 06:00:00', '2019-10-11 08:00:00',

  '2019-10-11 09:00:00'],

  dtype='datetime64[ns]', freq=None)

  使用完整的時間reindex

  df.reindex(t_index)

  A  B  C  D

  2019-10-11 00:00:00  28.0  14.0  25.0  15.0

  2019-10-11 01:00:00  11.0  11.0  14.0  26.0

  2019-10-11 02:00:00  NaN  NaN  NaN  NaN

  2019-10-11 03:00:00  15.0  12.0  14.0  17.0

  2019-10-11 04:00:00  16.0  10.0  14.0  12.0

  2019-10-11 05:00:00  NaN  NaN  NaN  NaN

  2019-10-11 06:00:00  24.0  11.0  13.0  26.0

  2019-10-11 07:00:00  NaN  NaN  NaN  NaN

  2019-10-11 08:00:00  21.0  29.0  29.0  22.0

  2019-10-11 09:00:00  18.0  18.0  17.0  25.0

  df.reindex(t_index, fill_value=0) # 使用0填充缺失值

  A  B  C  D

  2019-10-11 00:00:00  28  14  25  15

  2019-10-11 01:00:00  11  11  14  26

  2019-10-11 02:00:00  0  0  0  0

  2019-10-11 03:00:00  15  12  14  17

  2019-10-11 04:00:00  16  10  14  12

  2019-10-11 05:00:00  0  0  0  0

  2019-10-11 06:00:00  24  11  13  26

  2019-10-11 07:00:00  0  0  0  0

  2019-10-11 08:00:00  21  29  29  22

  2019-10-11 09:00:00  18  18  17  25

  需要補齊的時間序列不是索引?

  我們無法保證所有的情況都是使用時間格式作為索引的,那么在這樣的情況下我們應該怎么辦?

  df = pd.read_csv(file, parse_dates=[0], names=list('TABCD'), skiprows=[0])

  df鄭州做人流多少錢 http://www.gz020zj.com/

  T  A  B  C  D

  0  2019-10-11 00:00:00  28  14  25  15

  1  2019-10-11 01:00:00  11  11  14  26

  2  2019-10-11 03:00:00  15  12  14  17

  3  2019-10-11 04:00:00  16  10  14  12

  4  2019-10-11 06:00:00  24  11  13  26

  5  2019-10-11 08:00:00  21  29  29  22

  6  2019-10-11 09:00:00  18  18  17  25

  我們手動將時間列命名成"T"

  我們可以使用merge()實現:

  # 創建一個待混合的數據幀

  T_df = pd.DataFrame(t_index, columns=['T'])

  T_df

  T

  0  2019-10-11 00:00:00

  1  2019-10-11 01:00:00

  2  2019-10-11 02:00:00

  3  2019-10-11 03:00:00

  4  2019-10-11 04:00:00

  5  2019-10-11 05:00:00

  6  2019-10-11 06:00:00

  7  2019-10-11 07:00:00

  8  2019-10-11 08:00:00

  9  2019-10-11 09:00:00

  df.merge(T_df, how='right', sort=True)

  T  A  B  C  D

  0  2019-10-11 00:00:00  28.0  14.0  25.0  15.0

  1  2019-10-11 01:00:00  11.0  11.0  14.0  26.0

  2  2019-10-11 02:00:00  NaN  NaN  NaN  NaN

  3  2019-10-11 03:00:00  15.0  12.0  14.0  17.0

  4  2019-10-11 04:00:00  16.0  10.0  14.0  12.0

  5  2019-10-11 05:00:00  NaN  NaN  NaN  NaN

  6  2019-10-11 06:00:00  24.0  11.0  13.0  26.0

  7  2019-10-11 07:00:00  NaN  NaN  NaN  NaN

  8  2019-10-11 08:00:00  21.0  29.0  29.0  22.0

  9  2019-10-11 09:00:00  18.0  18.0  17.0  25.0

  使用merge的注意點:

  merge(right), 中right:T_df必須是數據幀(DataFrame),而且列名保持一致

  sort=True: 保證時間序列的正確


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM