我正在收集特定用例的交通信息,每10分鐘(但不準確)流量計數器的時間戳值,如:從時間戳流量計數器創建彙總統計信息
11:45 100
11:56 110
12:05 120
12:18 130
...
這是我的數據,我不能提高一點。
我想從這個輸入中產生某種每小時/每日統計數據,你能提出一些現成的函數或python中的算法嗎?
我正在考慮將時間戳計數器分爲幾小時,並將小時的第一個時間戳與最後一個小時的時間戳進行比較,並將差異顯示爲給定小時內的交通流量,但因爲這可能不會與小時例如以上述數據,它始於120 @ 12:05),它可能會完全關閉,並且按比例包含以前的數據(例如((120-110)/ 9)* 5)也會很好。但我不想重新發明輪子。
- 更新 -
基於下面的建議,我已經調查大熊貓產生下面的代碼。爲了澄清上述書面背景,時間戳值是二級的,並在一分鐘內不規則地分佈(例如11:45:03,11:56:34等)。因此,下面的代碼將輸入,重新索引到第二級,執行線性插值(假設流量均勻分佈在測量點之間),削減第一個和最後一個小數分鐘(以便如果第一個數據點在11:45 :03,它不會由於前3秒的缺失而失真)並將二級數據重新採樣到分級。目前這種方式正如預期的那樣工作,但速度非常緩慢,我想是由於二級插值,因爲數據跨越了幾個月的時間。任何想法如何進一步改善或加快代碼?
import datetime
import pandas as pd
import numpy as np
import math
COLUMNS = ['date', 'lan_in', 'inet_in', 'lan_out', 'inet_out']
ts_converter = lambda x: datetime.datetime.fromtimestamp(int(x))
td = pd.read_table("traffic_log",
names = COLUMNS,
delim_whitespace = True,
header = None,
converters = { 'date' : ts_converter }).set_index('date')
# reindex to second-level data
td = td.reindex(pd.date_range(min(td.index), max(td.index), freq="s"))
# linear interpolation to fill data for all seconds
td = td.apply(pd.Series.interpolate)
# cut first and last fractional minute data
td = td[pd.Timestamp(long(math.ceil(td.index.min().value/(1e9*60))*1e9*60)):
pd.Timestamp(long(math.floor(td.index.max().value/(1e9*60))*1e9*60))]
# resample to minute-level taking the minimum value for each minute
td = td.resample("t", how="min")
# change absolute values to differences
td = td.apply(pd.Series.diff)
# create daily statistics in gigabytes
ds = td.resample("d", how="sum").apply(lambda v: v/1024/1024/1024)
# create speed columns
for i in COLUMNS[1:]:
td[i+'_speed'] = td[i]/60/1024
使用http://pandas.pydata.org/ – YXD