在本例中,我們有兩天的數據採樣時間爲1分鐘,給我們2880次測量。測量結果依次收集到多個時區:歐洲/倫敦的前240分鐘以及'America/Los_Angeles'中剩餘的2640個測量值。根據當地時間(HH:MM)計算24小時週期內的每分鐘平均銷售量
import pandas as pd
import numpy as np
df=pd.DataFrame(index=pd.DatetimeIndex(pd.date_range('2015-03-29 00:00','2015-03-30 23:59',freq='1min',tz='UTC')))
df.loc['2015-03-29 00:00':'2015-03-29 04:00','timezone']='Europe/London'
df.loc['2015-03-29 04:00':'2015-03-30 23:59','timezone']='America/Los_Angeles'
df['sales1']=np.random.random_integers(100,size=len(df))
df['sales2']=np.random.random_integers(10,size=len(df))
要計算多日的24小時週期平均銷售每分鐘(根據UTC時間)以下方法效果很好:
utc_sales=df.groupby([df.index.hour,df.index.minute]).mean()
utc_sales.set_index(pd.date_range("00:00","23:59", freq="1min").time,inplace=True)
這GROUPBY方法也可以應用於計算基於其他兩個時區之一的平均銷售額,例如「歐洲/倫敦」。
df['London']=df.index.tz_convert('Europe/London')
london_sales=df.groupby([df['London'].dt.hour,df['London'].dt.minute]).mean()
london_sales.set_index(pd.date_range("00:00","23:59", freq="1min").time,inplace=True)
但是我掙扎拿出一個24小時的週期計算每分鐘每-as平均localtime-銷售的有效方式。我嘗試了上面的相同方法,但是當同一系列中存在多個時區時,groupby將恢復到utc中的索引。
def calculate_localtime(x):
return pd.to_datetime(x.name,unit='s').tz_convert(x['timezone'])
df['localtime']=df.apply(calculate_localtime,axis=1)
local_sales=df.groupby([df['localtime'].dt.hour,df['localtime'].dt.minute]).mean()
local_sales.set_index(pd.date_range("00:00","23:59",freq="1min").time,inplace=True)
我們可以驗證local_sales是否與utc_sales相同,因此此方法不起作用。
In [8]: np.unique(local_sales == utc_sales)
Out[8]: array([ True], dtype=bool)
任何人都可以推薦一種適用於大型數據集和多個時區的方法嗎?