Pandas DateTimeIndex多个groupby或resample聚合

时间:2018-02-06 21:42:41

标签: python pandas time-series

我在带有DateTimeIndex的pandas数据框中有一年的数据,我每30分钟就有一个记录。我想每月平均30分钟。换句话说,对于每个月,我希望每个月30分钟(00:00,00:30,...,23:30)的平均值汇总。

示例数据。

from datetime import datetime
import numpy as np
import pandas as pd
datetime_idx = pd.date_range(datetime(2017,1,1), datetime(2018,1,1), freq='30min')
np.random.seed(23)
data = np.random.randint(0, 100, size=len(datetime_idx))
df = pd.DataFrame({'Z': pd.Series(data, datetime_idx)})
df.head()
                      Z
2017-01-01 00:00:00  83
2017-01-01 00:30:00  40
2017-01-01 01:00:00  73
2017-01-01 01:30:00  54
2017-01-01 02:00:00  31

我试过链接重新取样但是没有用。

df.Z.resample('30min').mean().resample('M').mean()
2017-01-31    49.177419
2017-02-28    50.740327
2017-03-31    49.954973
2017-04-30    48.345833
2017-05-31    49.268145
2017-06-30    48.943056
2017-07-31    49.741263
2017-08-31    49.827285
2017-09-30    50.442361
2017-10-31    48.679435
2017-11-30    49.754861
2017-12-31    50.173387
2018-01-31    94.000000
Freq: M, Name: Z, dtype: float64

2 个答案:

答案 0 :(得分:0)

不熟悉resample()。所以我做了一些改变。

我将索引创建为列,并使用groupby()来获取平均值

df = pd.DataFrame({'Z': pd.Series(data),'ts': pd.Series(datetime_idx)})
df.groupby([df.ts.dt.month,df.ts.dt.hour,df.ts.dt.minute])['Z'].mean()

答案 1 :(得分:0)

在我这边,这两个返回相同的结果

select *
from #t t
    join #t2 t2
        on lower(trim(t.unique_id))=lower(trim(t2.unique_id))
UNION ALL
select *
from #t t
    join #t2 t2
        on lower(trim(t.unique_id))<>lower(trim(t2.unique_id))
        AND lower(trim(t.email))=lower(trim(t2.email)) 
UNION ALL
select *
FROM #t t
    join #t2 t2
        ON lower(trim(t.unique_id))<>lower(trim(t2.unique_id))
        AND lower(trim(t.email))<>lower(trim(t2.email)) 
        AND lower(trim(split_part(t.first_name,',',1))||trim(split_part(t.last_name,',',1)))=lower(trim(split_part(t2.first_name,',',1))||trim(split_part(t2.last_name,',',1)))