Python Pandas學習筆記。 vol4. 20190317

本文章僅供我本人學習記錄使用,不允許任何轉載及引用。特此聲明。


Pandas是建立在Numpy的基礎上的,處理二維數據時更加得心應手。
Pandas增加了更多高級使用的功能,比如數據自動對齊功能,時間序列的支持,確實數據的靈活處理等等。

In[1]: import pandas as pd
In[2]: import bumpy as np
In[3]: from pandas import Series, DataFrame


Series 和 DataFrame

是Pandas的兩種核心數據結構。

Series:

Series是值的序列,可以理解為一維數組,它只有一個列和索引。
索引可以定制,當不指定時默認使用整數索引,而且索引可以被命名:

In[1]:s1 = Series([1, 2, 3, 4, 5]) 
Out[1]: 
0    1
1    2
2    3
3    4
4    5
dtype: int64
# 第一列是未指定時默認的整數索引

In[2]: s2 = Series([1, 2, 3, 4, 5], index = ['a', 'b', 'c', 'd', 'e'])
Out[2]: 
a    1
b    2
c    3
d    4
e    5
dtype: int64
# 定制索引時

In[3]: s2.index.name = 'index'

In[4]: s2.index
Out[4]: Index(['a', 'b', 'c', 'd', 'e'], dtype='object', name='index')

In[5]: s2
Out[5]:
index
a    1
b    2
c    3
d    4
e    5
dtype: int64


DataFrame:

DataFrame類似于二維數組,有行和列之分,除了像Series一樣,多個行有索引之外,每個列上面還可以有標簽label,索引和標簽本身都可以被命名:

In[1]: df = DataFrame(np.random.randn(4, 4), index = ['a', 'b', 'c', 'd'], columns = ['A', 'B', 'C', 'D'])
Out[1]: 
          A         B         C         D
a -0.877290  0.434619 -0.996634 -0.398794
b  1.131611 -1.553991 -0.696632 -0.209264
c  0.785401 -0.967436 -0.063710 -0.442142
d  0.045040 -0.446373  1.835974  0.820756
# index和columns的設置也可以用index = list('abc')

In[2]: df.index
Out[2]: Index(['a', 'b', 'c', 'd'], dtype='object')

In[3]: df.index.name = 'Index1'
Out[3]: Index(['a', 'b', 'c', 'd'], dtype='object', name='Index1')

In [4]: df.columns
Out[4]: Index(['A', 'B', 'C', 'D'], dtype='object')

In[5]: df.columns.name = 'Col'
Out[5]: Index(['A', 'B', 'C', 'D'], dtype='object', name='Col')

In[6]: df
Out[6]: 
Col            A         B         C         D
Index1
a      -0.877290  0.434619 -0.996634 -0.398794
b       1.131611 -1.553991 -0.696632 -0.209264
c       0.785401 -0.967436 -0.063710 -0.442142
d       0.045040 -0.446373  1.835974  0.820756

# ***行列轉換***
In[]: df.T


選擇

當需要選擇部分數據時:

  • Series:

主要通過其索引來進行選擇:

In[1]: s2 = Series([1, 2, 3, 4, 5], index = ['a', 'b', 'c', 'd', 'e'])
Out[1]: 
a    1
b    2
c    3
d    4
e    5
dtype: int64

In[2]: s2[0]
Out[2]: 1
# 默認整數索引,一直存在的

In[3]: s2['a']
Out[3]: 1
# 指定后的索引

In[4]: s2[0:3]
Out[4]: 
a    1
b    2
c    3
dtype: int64

In[5]: s2['a':'c']
Out[5]: 
a    1
b    2
c    3
dtype: int64

以上調用多行,使用了s2.N和s2.loc。

  • s2[0:3]相當于s2.iloc[0:3],
  • s2['a':'c']相當于s2.loc['a':'c'],
  • 不能互換
    如下:
In[6]: s2.iloc[0:3]
Out[6]: 
a    1
b    2
c    3
dtype: int64

In[7]: s2.loc['a':'c']
Out[7]: 
a    1
b    2
c    3
dtype: int64
通過步長,用 iloc [[[間隔調用多行]]]:
In []: s2.iloc[::2]
Out[]:
a    1
c    3
e    5
dtype: int64
方法一:iloc[::5]
方法二:index.isin()

.iloc和.loc和.ix的區別進階學習:
.ix:(https://fishc.com.cn/thread-79821-1-1.html)
區別:(https://blog.csdn.net/hecongqing/article/details/61927615


  • DataFrame:

由于有行列之分,所以可以有多種選擇數據的方式:
-- 通過索引或標簽來選擇:

(1) 用標簽(列)選擇:
In[8]: df
Out[8]: 
          A         B         C         D
a -1.219787  0.730984 -0.785763 -0.634453
b -0.317280 -1.279367  0.359007  0.700775
c -2.226339  0.380315  2.120930 -1.161018
d -1.212816 -0.777530 -0.130212  1.492688

In[9]: df.A
Out[9]: 
a   -1.219787
b   -0.317280
c   -2.226339
d   -1.212816
Name: A, dtype: float64

In[10]: df['A']
Out[10]: 
a   -1.219787
b   -0.317280
c   -2.226339
d   -1.212816
Name: A, dtype: float64
# 使用標簽,df.A和df['A']相同,可以選擇某1列

# 使用標簽,選擇多列:
In[11]: df[df.columns[0:2]]
Out[11]: 
          A         B
a -1.219787  0.730984
b -0.317280 -1.279367
c -2.226339  0.380315
d -1.212816 -0.777530
# 只能使用默認整數索引
# 或者df.loc[:, ['A':'B']],下面有演示

---查看列名:

In[]: df.columns.tolist()
Out[]:

---刪除列或刪除行:

In[]: 
df.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')    
# 例:
In[]: 
df.drop((0, 'b_amt'), axis=1)
# (0, 'b_amt')就是一個列名,不用加‘’或()或[]

# 或 
In[]:
df.drop(['B', 'C'], axis=1)
# 或 
In[]: 
df.drop(index='cow', columns='small')
# Drop a row by index:
In[]: 
df.drop([0, 1])

---重命名列columns:

In[]:
df.rename(columns={'A':'a', 'B':'b'})


(2).選擇‘行’:

使用loc和iloc選擇一行或多行


In[12]: df
Out[12]: 
          A         B         C         D
a -1.219787  0.730984 -0.785763 -0.634453
b -0.317280 -1.279367  0.359007  0.700775
c -2.226339  0.380315  2.120930 -1.161018
d -1.212816 -0.777530 -0.130212  1.492688

In[13]: df.loc['a']
Out[13]: 
A   -1.219787
B    0.730984
C   -0.785763
D   -0.634453
Name: a, dtype: float64
# df.iloc[0]有同樣效果

In[14]: df.loc['a':'b']
Out[14]: 
          A         B         C         D
a -1.219787  0.730984 -0.785763 -0.634453
b -0.317280 -1.279367  0.359007  0.700775

# 用loc和iloc選擇列:
In[15]: df.loc[:, 'A':'B']
Out[15]: 
          A         B
a -1.219787  0.730984
b -0.317280 -1.279367
c -2.226339  0.380315
d -1.212816 -0.777530
# 相當于用‘:’同時選擇所有行,并在所有列中選擇某幾列。

# 由此知道,選擇某一行某一列的一個元素,或某幾行或某幾列的多個元素就簡單了:
In[16]: df
Out[16]: 
          A         B         C         D
a -1.219787  0.730984 -0.785763 -0.634453
b -0.317280 -1.279367  0.359007  0.700775
c -2.226339  0.380315  2.120930 -1.161018
d -1.212816 -0.777530 -0.130212  1.492688

In[17]: df.loc['a', 'A']
Out[17]: -1.2197869779119481
# df.iloc[0, 0],效果相同

In[18]: df.loc['b':'c', 'C':'D']
Out[18]: 
          C         D
b  0.359007  0.700775
c  2.120930 -1.161018
# df.iloc[1:3, 2:4], 效果相同

# ***隔列選擇***
df[['A','D']]  
#選擇表格中的'w'、'z'列
#更多請查看:https://blog.csdn.net/wanglingli95/article/details/78887771


缺失值'NaN'和數據自動對齊

在Pandas中最重要的一個功能是,它可以對不同索引的對象進行算術運算。比如將兩個Series數據進行相加時,如果存在不同的索引,則結果是兩個索引的并集, 示例如下:

In[1]: s1 = Series([1, 2, 3, 4], index = ['a', 'b', 'c', 'd'])

In[2]: s1
Out[2]: 
a    1
b    2
c    3
d    4
dtype: int64

In[3]: s2 = Series([2, 3, 4, 5], index = ['b', 'c', 'd', 'e'])
Out[3]: 
b    2
c    3
d    4
e    5
dtype: int64

In[4]: s1 + s2
Out[4]: 
a    NaN
b    4.0
c    6.0
d    8.0
e    NaN
dtype: float64
# 兩個索引的并集

2個Series中['b', 'c', 'd']的索引是相同的,所以值可以相加,但不重疊的索引引入了NaN值(缺失值)。
而缺失值會在運算中傳播,所以最終結果也是NaN值。(后面會講解)
根據相同的索引進行自動計算,這就是自動對齊功能。

在DataFrame中,相同的規格也生效:

In[5]: df1 = DataFrame(np.arange(9).reshape(3, 3), columns = list('ABC'), index = list('abc'))
Out[5]: 
   A  B  C
a  0  1  2
b  3  4  5
c  6  7  8

In[6]: df2 = DataFrame(np.arange(12).reshape(3,
    ...: 4), index = list('bcd'), columns = list('
    ...: ABDE'))
Out[6]: 
   A  B   D   E
b  0  1   2   3
c  4  5   6   7
d  8  9  10  11

In[7]: df1 + df2
Out[7]: 
      A     B   C   D   E
a   NaN   NaN NaN NaN NaN
b   3.0   5.0 NaN NaN NaN
c  10.0  12.0 NaN NaN NaN
d   NaN   NaN NaN NaN NaN

可以看出,DataFrame的計算也進行了自動對齊操作,NaN值被自動填充,而由于NaN值會傳播(如上解釋),所以相加的結果也是NaN。
如果我們想避免結果為NaN值,可以指定使用值來填充(替代)NaN值,如下:

In[8]: df1.add(df2, fill_value = 0)
Out[8]: 
      A     B    C     D     E
a   0.0   1.0  2.0   NaN   NaN
b   3.0   5.0  5.0   2.0   3.0 
c  10.0  12.0  8.0   6.0   7.0
d   8.0   9.0  NaN  10.0  11.0
# 使用fill_value參數指定NaN值的填充值,使用與Series和DataFrame。

我們指定了‘0’填充了NaN值,然后帶入計算過程(這里是先填充值,再運算)。
這里剩余的NaN值是因為df1和df2中都未定義。


常用運算

Series和DataFrame的常用運算和Numpy差不多。
在Pandas中還有一種比較常見的操作時將函數運用到每一行或者每一列上面,DataFrame的apply方法可以實現此功能,比如想統計每行和每列的極差(最大值和最小值之差):

In[1]: df1 = DataFrame(np.arange(9).reshape(3, 3
    ...: ), index = list('abc'), columns = list('A
    ...: BC'))

In[2]: df1
Out[2]: 
   A  B  C
a  0  1  2
b  3  4  5
c  6  7  8

In[3]: f = lambda x: x.max() - x.min()
# 定義了f,f是匿名函數

In [4]: f
Out[4]: <function __main__.<lambda>>
# f匿名函數簡單的返回列表的極差

In[5]: df1.apply(f)
Out[5]: 
A    6
B    6
C    6
dtype: int64
# 將計算極差的匿名函數f使用apply方法應用到df1上

In [6]: df1.apply(f, axis = 1)
Out[6]:
a    2
b    2
c    2
dtype: int64
# 這個加入了參數axis = 1,所以計算df1中每一行的極差(索引‘a’行中max最大值‘2’和min最小值‘0’之差是2)
# 上一個計算中,默認的axis是0(列),所以計算的是每一列的極差(索引‘A’列中max最大值‘6’和min最小值‘0’之差是6)

如果想將某函數應用到每一個元素上,DataFrame可以使用df.applymap方法,Series可以使用s.map方法:

In [7]: df1.applymap(lambda x: x + 1)
Out[7]:
   A  B  C
a  1  2  3
b  4  5  6
c  7  8  9

In [8]: s1
Out[8]:
a    1
b    2
c    3
d    4
dtype: int64

In [9]: s1.map(lambda x: x + 1)
Out[9]:
a    2
b    3
c    4
d    5
dtype: int64
# 以上結果是讓所有元素增加1,其結果與df1 + 1和s1 + 1的運算結果相同。


常用統計:

比如求平均值,方差等,同時通過describe方法可以得知當前數據的一些常用統計信息:

In[]: df1 = DataFrame(np.arange(9).reshape(3,3), columns=list('ABC'), index=list('abc'))

In[]: df1
Out[]: 
   A  B  C
a  0  1  2
b  3  4  5
c  6  7  8

In[]: df1.sum()
Out[]: 
A     9
B    12
C    15
dtype: int64
# 每列求和

In[]: df1.sum(axis = 1)
Out[]:
a     3
b    12
c    21
dtype: int64
# 每行求和

In[]: df1.mean()
Out[]:
A    3.0
B    4.0
C    5.0
dtype: float64
# 每列的平均數

In []: df1.mean(axis = 1)
Out[]:
a    1.0
b    4.0
c    7.0
dtype: float64
# 每行的平均數

In[]: df1.describe()
Out[]: 
         A    B    C
count  3.0  3.0  3.0 # 列的元素的數量
mean   3.0  4.0  5.0 # 列的平均值
std    3.0  3.0  3.0 # 列的標準差
min    0.0  1.0  2.0 # 列的最小值(0%)
25%    1.5  2.5  3.5 # 下四分位數
50%    3.0  4.0  5.0 # 中位數
75%    4.5  5.5  6.5 # 上四分位數
max    6.0  7.0  8.0 # 列的最大值(100%)

In[]: df1.loc['b'].describe()
Out[]:
count    3.0
mean     4.0
std      1.0
min      3.0
25%      3.5
50%      4.0
75%      4.5
max      5.0
Name: b, dtype: float64
# 第二行'b'行的統計信息
# *目前還不知道怎么統計多行信息*


數據合并和分組

合并2個DataFrame數據,方法主要有2種:
(1)簡單進行拼接,通過pd.concat方法實現
(2)根據列名類像數據庫表查詢一樣進行合并,通過pd.merge方法實現

In[]: df1 = DataFrame(np.random.randn(3, 3))

In[]: df2 = DataFrame(np.random.randn(3, 3), index = [5, 6, 7])

In[]: df1
Out[]: 
          0         1         2
0 -2.072551 -1.759958  0.465906
1 -1.302374  2.343270  0.233606
2 -1.450751  1.160754  1.271709

In[]: df2
Out[]: 
          0         1         2
5  0.092593  1.846336  1.757417
6  0.328430 -1.662719 -0.366255
7 -0.360098 -0.334050 -0.032662

In[]: pd.concat([df1, df2])
Out[]: 
          0         1         2
0 -2.072551 -1.759958  0.465906
1 -1.302374  2.343270  0.233606
2 -1.450751  1.160754  1.271709
5  0.092593  1.846336  1.757417
6  0.328430 -1.662719 -0.366255
7 -0.360098 -0.334050 -0.032662
# 當多個數據集,擁有相同的列時,我們可以按照這個列進行合并操作
# 類似于數據庫中的join操作

In[]: df3 = DataFrame({'code':[600276, 600519], 'name':['hengrui', 'maotai'], 'bought_price': [0.00, 649.00]})

In[]: df3
Out[]: 
   bought_price    code     name
0           0.0  600276  hengrui
1         649.0  600519   maotai

In[]: df3 = df3.rename(columns = {'bought_price':'in
     ...: _price'})
Out[]:
   in_price    code     name
0       0.0  600276  hengrui
1     649.0  600519   maotai
# 重命名單個或多個列索引

In[]: df4 = DataFrame({'code': [600276, 600519], 'volume': [100, 100], 'in_date': ['2019-03-18', '2018-02-13']})

In[]: df4
Out[]: 
     code     in_date  volume
0  600276  2019-03-18     100
1  600519  2018-02-13     100

In[]: pd.merge(df3, df4)
Out[]: 
   in_price    code     name     in_date  volume
0       0.0  600276  hengrui  2019-03-18     100
1     649.0  600519   maotai  2018-02-13     100

自我理解:

  • pd.concat([])用于合并行:當行內容不同時,列名相同
  • pd.merge()用于合并列:當列內容不同時,行名相同

上面的代碼中我們通過字典創建了兩個數據集,可以看到當通過字段創建DataFrame數據集時,鍵名key變成了列名column name。
df3和df4有共同的列course,當進行merge操作的時候Pandas會自動將這列進行合并。
合并數據集時,有很多參數可以選擇,比如選擇在根據哪一列進行合并、合并的方式等,可以用help(pd.merge)查看完整的幫助文檔。



在Pandas中,也支持類似于數據庫查詢語句GROUP BY的功能,也就是按照某列進行分組,然后再分組上進行一些計算操作:

In[]: df  = DataFrame({'user_id': ['Jack', 'Sam', 'Jack'], 'course': ['Math', 'Sci', 'Eng'], 'minutes': [9, 36, 45]})

In[]: df
Out[]: 
  course  minutes user_id
0   Math        9    Jack
1    Sci       36     Sam
2    Eng       45    Jack

# 方法一:篩選出所有user_id為'Jack'的行,然后進行求和統計:
In[]: df[df['user_id'] == 'Jack']
Out[]: 
  course  minutes user_id
0   Math        9    Jack
2    Eng       45    Jack

In[]: df[df['user_id'] == 'Jack']['minutes']
Out[]: 
0     9
2    45
Name: minutes, dtype: int64

In[]: df[df['user_id'] == 'Jack']['minutes'].sum()
Out[]: 54
# 可以看出我們可以先通過df[df['user_id'] =='Jack']布爾索引篩選出所有的相關行,然后通過結合列篩選功能過濾其他列,只剩下時間統計列(minutes所在列為學習時間列),最后通過求和運算統計出了學習時間。

# 方法二:類似于數據庫的GROUP BY功能進行計算:
In[]: df[['user_id', 'minutes']]
Out[]: 
  user_id  minutes
0    Jack        9
1     Sam       36
2    Jack       45

In[]: df[['user_id', 'minutes']].groupby('user_id').sum()
Out[]: 
         minutes
user_id
Jack          54
Sam           36
# 可以看到,我們先過濾列,只剩下了user_id和minutes列,然后通過groupby方法在user_id列上進行分組并求和,相對于前一種方式,分組求和更靈活一些。

自我理解分解:

  • 進行邏輯比較運算(Numpy和Pandas都可以),比如我們想知道一個多維數組中哪些值大于某一個指定值


通過一個元素查詢行數據

# 1.
In[]: df_bool = df['user_id'] == 'Jack'
# 計算'user_id'列是否等于'Jack', 用df_bool顯示
In[]: df_bool
Out[]: 
0     True
1    False
2     True
Name: user_id, dtype: bool

In []: df[df_bool]
Out[]:
  course  minutes user_id
0   Math        9    Jack
2    Eng       45    Jack
# 將a_bool放在df中比較,將只顯示a_bool中為'True'的'user_id列'所在的行內容。
# 等同于df[df[...]]

# 2.
In[]: df[df['user_id'] == 'Jack']['minutes']
Out[]: 
0     9
2    45
Name: minutes, dtype: int64

In[]: df[df['user_id'] == 'Jack'].minutes
Out[]: 
0     9
2    45
Name: minutes, dtype: int64
# ['minutes']和.minutes的輸出結果相同,都是對DataFrame的‘列選擇’操作

# 3. 上面篩選出來的是‘Name: minutes, dtype: int64’,所以.sum()是對minutes的元素值進行求和
In[]: df[df['user_id'] == 'Jack']['minutes'].sum()
Out[]: 54


時間序列處理

根據數據集中的時間戳進行運算,
在Python中,時間處理方面的相關功能主要集中在datetime包中,主要有三種對象:

  • datetime.datetime:代表時間對象;
  • datetime.date:代表某一天;
  • datetime.timedelta:代表兩個datetime.datetime對象之間的時間差。
# datetime.datetime和datetime.timedelta的用法
In[]: from date time import datetime, timedelta

In[]: d1 = datetime(2017, 8, 1)
Out[]: datetime.datetime(2017, 8, 1, 0, 0)

In[]: delta = timedelta(days=10)

In[]: d1 + delta
Out[]: datetime.datetime(2017, 8, 11, 0, 0)

In[]: dates = [datetime(2018, 1, 1), datetime(2018, 1, 2), datetime(2018, 1, 3), datetime(2018, 1, 4)]
Out[]: 
[datetime.datetime(2018, 1, 1, 0, 0),
 datetime.datetime(2018, 1, 2, 0, 0),
 datetime.datetime(2018, 1, 3, 0, 0),
 datetime.datetime(2018, 1, 4, 0, 0)]

In[]: ts = Series(np.random.randn(4), index = dates)
Out[]: 
2018-01-01    0.241635
2018-01-02    0.121023
2018-01-03   -1.992435
2018-01-04   -0.457257
dtype: float64

In[]: ts.index
Out[]: DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04'], dtype='datetime64[ns]', freq=None)

In[]: ts.index[0]
Out[]: Timestamp('2018-01-01 00:00:00')

# 通過datetime時間類型生成了一堆時間,然后基于此創建了一個時間序列ts, 可以看到ts的索引類型為DatetimeIndex類型。
生成ts以后我們就有多種方法選擇元素了,只需要傳入一個能被Pandas識別的日期字符串就可以了,如下:

In []: ts
Out[]:
2018-01-01    0.241635
2018-01-02    0.121023
2018-01-03   -1.992435
2018-01-04   -0.457257
dtype: float64

In []: ts.index[0]
Out[]: Timestamp('2018-01-01 00:00:00')

In []: ts[ts.index[0]]
Out[]: 0.2416345185713773

In [311]: ts['2018-01-01']
Out[311]: 0.2416345185713773

In [312]: ts['2018/01/01']
Out[312]: 0.2416345185713773

In [313]: ts['1/1/2018']
Out[313]: 0.2416345185713773

In[]: ts[datetime(2018, 1, 1)]
Out[315]: 0.2416345185713773
# ts[ts.index[0]] , ts['2018-01-01'], ['2018-01-01'], ts['1/1/2018'], ts['1/1/2018'] 都可以選擇同一個元素


生成日期范圍:

在Pandas中生成日期范圍主要通過pandas.date_range函數完成,該函數主要有以下幾個參數:

  • start:指定了日期范圍的起始時間;
  • end:指定了日期范圍的結束時間;
  • periods:指定了間隔范圍,如果只是指定了start和end日期中的其中一個,則需要改參數;
  • freq:指定了日期頻率,比如D代表每天,H代表每小時,M代表月,這些頻率字符前也可以指定一個整數,代表具體多少天。。。,比如5D代表5天。還有一些其他的頻率字符串,比如MS代表每月第一天,BM代表每月最后一個工作日,或者是頻率組合字符串,比如1h30min代表1小時30分鐘。
    如下:
In[]: pd.date_range('2018-1-1', '2019', freq = 'M')
Out[]: 
DatetimeIndex(['2018-01-31', '2018-02-28', '2018-03-31', '2018-04-30',
               '2018-05-31', '2018-06-30', '2018-07-31', '2018-08-31',
               '2018-09-30', '2018-10-31', '2018-11-30', '2018-12-31'],
              dtype='datetime64[ns]', freq='M')

In[]: pd.date_range('2018-01-01', '2019', freq = 'BM')
Out[]: 
DatetimeIndex(['2018-01-31', '2018-02-28', '2018-03-30', '2018-04-30',
               '2018-05-31', '2018-06-29', '2018-07-31', '2018-08-31',
               '2018-09-28', '2018-10-31', '2018-11-30', '2018-12-31'],
              dtype='datetime64[ns]', freq='BM')

In[]: pd.date_range('2018-1-1', '2019', freq = 'MS')
Out[]: 
DatetimeIndex(['2018-01-01', '2018-02-01', '2018-03-01', '2018-04-01',
               '2018-05-01', '2018-06-01', '2018-07-01', '2018-08-01',
               '2018-09-01', '2018-10-01', '2018-11-01', '2018-12-01',
               '2019-01-01'],
              dtype='datetime64[ns]', freq='MS')
# 更多date_range()方法的使用請看Pandas datetime學習筆記

有的時候時間序列是按每小時顯示統計的,但是我們想將統計頻率轉換成按天來統計,這個時候可以使用時間序列的resample方法,該方法非常強大,不僅僅支持高頻率的數據聚合到低頻率(降采樣),也支持低頻率轉化到高頻率統計(升采樣):

In[]: dates = pd.date_range('2018-1-1', '2018-1-2 23:00:00', freq = 'H')

In[]: len(dates)
Out[]: 48

In[]: ts = Series(np.arange(len(dates)), index = dates)

In[]: ts.size
Out[]: 48

In[]: ts.head(5)
Out[]:
2018-01-01 00:00:00    0
2018-01-01 01:00:00    1
2018-01-01 02:00:00    2
2018-01-01 03:00:00    3
2018-01-01 04:00:00    4
Freq: H, dtype: int64


In[]: ts.tail(5)
Out[]: 
2018-01-02 19:00:00    43
2018-01-02 20:00:00    44
2018-01-02 21:00:00    45
2018-01-02 22:00:00    46
2018-01-02 23:00:00    47
Freq: H, dtype: int64

以上代碼中,我們創建了以每小時為頻率的時間序列.

如果我們將以上數據轉換為按每天的數據統計:

In[]: ts.resample('D').sum()
Out[]: 
2018-01-01    276
2018-01-02    852
Freq: D, dtype: int64
# 先使用resample('D')方法指定了按天統計,接著使用sum方法求和了按天的所有數據(0-23相加,24-47相加)

# 當把底頻率的數據轉換成高頻率的數據時,默認情況下Pandas會引入NaN值,因為沒辦法從低頻率的數據計算出高頻率的數據,但可以通過fill_method參數指定插入值的方式:
In[]: ts.resample('D').mean().resample('H').mean()
Out[]: 
2018-01-01 00:00:00    11.5
2018-01-01 01:00:00     NaN
2018-01-01 02:00:00     NaN
2018-01-01 03:00:00     NaN
2018-01-01 04:00:00     NaN
2018-01-01 05:00:00     NaN
2018-01-01 06:00:00     NaN
2018-01-01 07:00:00     NaN
2018-01-01 08:00:00     NaN
2018-01-01 09:00:00     NaN
2018-01-01 10:00:00     NaN
2018-01-01 11:00:00     NaN
2018-01-01 12:00:00     NaN
2018-01-01 13:00:00     NaN
2018-01-01 14:00:00     NaN
2018-01-01 15:00:00     NaN
2018-01-01 16:00:00     NaN
2018-01-01 17:00:00     NaN
2018-01-01 18:00:00     NaN
2018-01-01 19:00:00     NaN
2018-01-01 20:00:00     NaN
2018-01-01 21:00:00     NaN
2018-01-01 22:00:00     NaN
2018-01-01 23:00:00     NaN
2018-01-02 00:00:00    35.5
Freq: H, dtype: float64

In[]: ts.resample('D').mean().resample('H').ffill()
# .fill()代表用前面的值替代NaN值
Out[]: 
2018-01-01 00:00:00    11.5
2018-01-01 01:00:00    11.5
2018-01-01 02:00:00    11.5
2018-01-01 03:00:00    11.5
2018-01-01 04:00:00    11.5
2018-01-01 05:00:00    11.5
2018-01-01 06:00:00    11.5
2018-01-01 07:00:00    11.5
2018-01-01 08:00:00    11.5
2018-01-01 09:00:00    11.5
2018-01-01 10:00:00    11.5
2018-01-01 11:00:00    11.5
2018-01-01 12:00:00    11.5
2018-01-01 13:00:00    11.5
2018-01-01 14:00:00    11.5
2018-01-01 15:00:00    11.5
2018-01-01 16:00:00    11.5
2018-01-01 17:00:00    11.5
2018-01-01 18:00:00    11.5
2018-01-01 19:00:00    11.5
2018-01-01 20:00:00    11.5
2018-01-01 21:00:00    11.5
2018-01-01 22:00:00    11.5
2018-01-01 23:00:00    11.5
2018-01-02 00:00:00    35.5
Freq: H, dtype: float64

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374