日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Pandas时序数据处理入门

發(fā)布時(shí)間:2024/8/23 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pandas时序数据处理入门 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作為一個(gè)幾乎每天與時(shí)間序列數(shù)據(jù)打交道的人員,我發(fā)現(xiàn)panda?Python包在時(shí)間序列的操作和分析方面有強(qiáng)大優(yōu)勢(shì)。

這篇關(guān)于panda時(shí)間序列數(shù)據(jù)處理的基本介紹可以帶你入門時(shí)間序列分析。本文將主要介紹以下操作:

  • 創(chuàng)建一個(gè)日期范圍
  • 處理時(shí)間戳數(shù)據(jù)
  • 將字符串?dāng)?shù)據(jù)轉(zhuǎn)換為時(shí)間戳
  • 在數(shù)據(jù)框中索引和切片時(shí)間序列數(shù)據(jù)
  • 重新采樣不同時(shí)間段的時(shí)間序列匯總/匯總統(tǒng)計(jì)數(shù)據(jù)
  • 計(jì)算滾動(dòng)統(tǒng)計(jì)數(shù)據(jù),如滾動(dòng)平均值
  • 處理丟失數(shù)據(jù)
  • 了解unix/epoch時(shí)間的基礎(chǔ)知識(shí)
  • 了解時(shí)間序列數(shù)據(jù)分析的常見陷阱

接下來我們一起步入正題。如果想要處理已有的實(shí)際數(shù)據(jù),你可能考慮從使用panda read_csv將文件讀入數(shù)據(jù)框開始,然而在這里,我們將直接從處理生成的數(shù)據(jù)開始。

首先導(dǎo)入我們將會(huì)使用到的庫(kù),然后用它們創(chuàng)建日期范圍

import pandas as pd from datetime import datetime import numpy as npdate_rng = pd.date_range(start='1/1/2018', end='1/08/2018', freq='H')

這個(gè)日期范圍的時(shí)間戳為每小時(shí)一次。如果我們調(diào)用date_rng,我們會(huì)看到如下所示:

DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00','2018-01-01 02:00:00', '2018-01-01 03:00:00','2018-01-01 04:00:00', '2018-01-01 05:00:00','2018-01-01 06:00:00', '2018-01-01 07:00:00','2018-01-01 08:00:00', '2018-01-01 09:00:00',...'2018-01-07 15:00:00', '2018-01-07 16:00:00','2018-01-07 17:00:00', '2018-01-07 18:00:00','2018-01-07 19:00:00', '2018-01-07 20:00:00','2018-01-07 21:00:00', '2018-01-07 22:00:00','2018-01-07 23:00:00', '2018-01-08 00:00:00'],dtype='datetime64[ns]', length=169, freq='H')

我們可以檢查第一個(gè)元素的類型:

type(date_rng[0]) #returns pandas._libs.tslib.Timestamp

讓我們用時(shí)間戳數(shù)據(jù)的創(chuàng)建一個(gè)示例數(shù)據(jù)框,并查看前15個(gè)元素:

df = pd.DataFrame(date_rng, columns=['date']) df['data'] = np.random.randint(0,100,size=(len(date_rng))) df.head(15)

如果想進(jìn)行時(shí)間序列操作,我們需要一個(gè)日期時(shí)間索引。這樣一來,數(shù)據(jù)框便可以在時(shí)間戳上建立索引。

將數(shù)據(jù)框索引轉(zhuǎn)換為datetime索引,然后顯示第一個(gè)元素:

df['datetime'] = pd.to_datetime(df['date']) df = df.set_index('datetime') df.drop(['date'], axis=1, inplace=True) df.head()

如果數(shù)據(jù)中的“時(shí)間”戳實(shí)際上是字符串類型和數(shù)值類型相比較,該怎么辦呢?我們可以將date_rng轉(zhuǎn)換為字符串列表,然后將字符串轉(zhuǎn)換為時(shí)間戳。

string_date_rng = [str(x) for x in date_rng] string_date_rng #returns ['2018-01-01 00:00:00','2018-01-01 01:00:00','2018-01-01 02:00:00','2018-01-01 03:00:00','2018-01-01 04:00:00','2018-01-01 05:00:00','2018-01-01 06:00:00','2018-01-01 07:00:00','2018-01-01 08:00:00','2018-01-01 09:00:00',...

可以通過推斷字符串的格式將其轉(zhuǎn)換為時(shí)間戳,然后查看這些值:

timestamp_date_rng = pd.to_datetime(string_date_rng, infer_datetime_format=True) timestamp_date_rng #returns DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00','2018-01-01 02:00:00', '2018-01-01 03:00:00','2018-01-01 04:00:00', '2018-01-01 05:00:00','2018-01-01 06:00:00', '2018-01-01 07:00:00','2018-01-01 08:00:00', '2018-01-01 09:00:00',...'2018-01-07 15:00:00', '2018-01-07 16:00:00','2018-01-07 17:00:00', '2018-01-07 18:00:00','2018-01-07 19:00:00', '2018-01-07 20:00:00','2018-01-07 21:00:00', '2018-01-07 22:00:00','2018-01-07 23:00:00', '2018-01-08 00:00:00'],dtype='datetime64[ns]', length=169, freq=None)

但是如果需要轉(zhuǎn)換一個(gè)唯一的字符串格式呢?

我們可以創(chuàng)建一個(gè)任意的字符串形式的日期列表,并將它們轉(zhuǎn)換為時(shí)間戳:

string_date_rng_2 = ['June-01-2018', 'June-02-2018', 'June-03-2018'] timestamp_date_rng_2 = [datetime.strptime(x,'%B-%d-%Y') for x in string_date_rng_2] timestamp_date_rng_2 #returns [datetime.datetime(2018, 6, 1, 0, 0),datetime.datetime(2018, 6, 2, 0, 0),datetime.datetime(2018, 6, 3, 0, 0)]

如果把它放到數(shù)據(jù)框中,將會(huì)如何?

df2 = pd.DataFrame(timestamp_date_rng_2, columns=['date']) df2

回到最初的數(shù)據(jù)框架,讓我們通過解析時(shí)間戳索引來查看數(shù)據(jù):

假設(shè)只想查看本月2號(hào)的數(shù)據(jù),可以使用如下索引。

df[df.index.day == 2]

頂部如圖所示:

也可以通過數(shù)據(jù)框索引直接調(diào)用想查看的日期:

df['2018-01-03']

如何在特定日期之間選擇數(shù)據(jù)

df['2018-01-04':'2018-01-06']

我們填充的基本數(shù)據(jù)框提供了頻率以小時(shí)計(jì)的數(shù)據(jù),但同樣可以以不同的頻率重新采樣數(shù)據(jù),并指定如何計(jì)算新樣本頻率的匯總統(tǒng)計(jì)信息。我們可以取每天頻率下數(shù)據(jù)的最小值、最大值、平均值、總和等,而不是每小時(shí)的頻率,如下面的例子,計(jì)算每天數(shù)據(jù)的平均值:

df.resample('D').mean()

那么諸如滾動(dòng)平均值或滾動(dòng)和之類的窗口統(tǒng)計(jì)信息呢?

讓我們?cè)谠瓉淼膁f中創(chuàng)建一個(gè)新列,計(jì)算3個(gè)窗口周期內(nèi)的滾動(dòng)和,然后查看數(shù)據(jù)框的頂部:

df ['rolling_sum'] = df.rolling(3).sum() df.head(10)

可以看到,在這個(gè)正確的計(jì)算中,只有當(dāng)存在三個(gè)周期可以回顧時(shí),它才開始具有有效值。

這可以有效地幫我們了解到,當(dāng)處理丟失的數(shù)據(jù)值時(shí),如何向前或向后“滾動(dòng)”數(shù)據(jù)。

這是我們的df,但有一個(gè)新的列,采取滾動(dòng)求和并向后“滾動(dòng)”數(shù)據(jù):

df['rolling_sum'] = df.rolling(3).sum() df.head(10)

采用諸如平均時(shí)間之類的實(shí)際值用于填補(bǔ)丟失的數(shù)據(jù),這種方法通常來說是有效的。但一定謹(jǐn)記,如果你正處理一個(gè)時(shí)間序列的問題,并且希望數(shù)據(jù)是切合實(shí)際的,那么你不應(yīng)該向后“滾動(dòng)”數(shù)據(jù)。因?yàn)檫@樣一來,你需要的關(guān)于未來的信息就永遠(yuǎn)不可能在那個(gè)時(shí)間獲取到。你可能更希望頻繁地向前“滾動(dòng)”數(shù)據(jù),而不是向后“滾動(dòng)”。

在處理時(shí)間序列數(shù)據(jù)時(shí),可能會(huì)遇到Unix時(shí)間中的時(shí)間值。Unix時(shí)間,也稱為Epoch時(shí)間,是自協(xié)調(diào)世界時(shí)(UTC) 1970年1月1日星期四00:00:00以后經(jīng)過的秒數(shù)。使用Unix時(shí)間有助于消除時(shí)間戳的歧義,這樣我們就不會(huì)被時(shí)區(qū)、夏令時(shí)等混淆。

下面是一個(gè)時(shí)間t在Epoch時(shí)間的例子,它將Unix/Epoch時(shí)間轉(zhuǎn)換為UTC中的常規(guī)時(shí)間戳:

epoch_t = 1529272655 real_t = pd.to_datetime(epoch_t, unit='s') real_t #returns Timestamp('2018-06-17 21:57:35')

如果我想把UTC中的時(shí)間轉(zhuǎn)換為自己的時(shí)區(qū),可以簡(jiǎn)單地做以下操作:

real_t.tz_localize('UTC').tz_convert('US/Pacific') #returns Timestamp('2018-06-17 14:57:35-0700', tz='US/Pacific')

掌握了這些基礎(chǔ)知識(shí)后,就可以開始處理時(shí)間序列數(shù)據(jù)了。

以下是一些處理時(shí)間序列數(shù)據(jù)時(shí)要記住的技巧和常見的陷阱:

  • 檢查數(shù)據(jù)中可能由區(qū)域特定時(shí)間變化(如夏令時(shí))引起的差異
  • 精心跟蹤時(shí)區(qū)?- 讓他人通過代碼了解你的數(shù)據(jù)所在的時(shí)區(qū),并考慮轉(zhuǎn)換為UTC或標(biāo)準(zhǔn)化值以保持?jǐn)?shù)據(jù)標(biāo)準(zhǔn)化。
  • 丟失的數(shù)據(jù)可能經(jīng)常發(fā)生 - 請(qǐng)確保記錄清潔規(guī)則并考慮不回填在采樣時(shí)無法獲得的信息。
  • 請(qǐng)記住,當(dāng)重新采樣數(shù)據(jù)或填寫缺失值時(shí),將丟失有關(guān)原始數(shù)據(jù)集的一定數(shù)量的信息。建議跟蹤所有數(shù)據(jù)轉(zhuǎn)換并跟蹤數(shù)據(jù)問題根源。
  • 重新采樣數(shù)據(jù)時(shí),最佳方法(平均值,最小值,最大值,總和等)取決于擁有的數(shù)據(jù)類型以及采樣方式。請(qǐng)仔細(xì)考慮如何重新采樣數(shù)據(jù)以進(jìn)行分析。


原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的Pandas时序数据处理入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。