如何使用Pandas

时间:2018-03-07 16:41:07

标签: python pandas dataframe timestamp pandas-groupby

我有以下用时间戳索引的数据框结构:

    neg neu norm    pol pos date
time                        
1520353341  0.000   1.000   0.0000  0.000000    0.000   
1520353342  0.121   0.879   -0.2960 0.347851    0.000   
1520353342  0.217   0.783   -0.6124 0.465833    0.000   

我从时间戳创建日期:

data_frame['date'] = [datetime.datetime.fromtimestamp(d) for d in data_frame.time]

结果:

    neg neu norm    pol pos date
time                        
1520353341  0.000   1.000   0.0000  0.000000    0.000   2018-03-06 10:22:21
1520353342  0.121   0.879   -0.2960 0.347851    0.000   2018-03-06 10:22:22
1520353342  0.217   0.783   -0.6124 0.465833    0.000   2018-03-06 10:22:22

我希望按小时分组,同时获取所有值的平均值,除了时间戳,这应该是从小时开始的小组开始的地方。所以这是我要存档的结果:

    neg neu norm    pol pos
time                    
1520352000  0.027989    0.893233    0.122535    0.221079    0.078779
1520355600  0.028861    0.899321    0.103698    0.209353    0.071811

我到目前为止最接近的是answer

data = data.groupby(data.date.dt.hour).mean()

结果:

    neg neu norm    pol pos
date                    
0   0.027989    0.893233    0.122535    0.221079    0.078779
1   0.028861    0.899321    0.103698    0.209353    0.071811

但是我无法弄清楚如何保留时间戳,考虑到煤矸石开始的时间。

3 个答案:

答案 0 :(得分:3)

在我发布我的圆形解决方案之后,我遇到了这个宝石,pd.DataFrame.resample

# Construct example dataframe
times = pd.date_range('1/1/2018', periods=5, freq='25min')
values = [4,8,3,4,1]
df = pd.DataFrame({'val':values}, index=times)

# Resample by hour and calculate medians
df.resample('H').median()

如果您不希望将时间作为索引,则可以groupbyGrouper一起使用:

df = pd.DataFrame({'val':values, 'times':times})
df.groupby(pd.Grouper(level='times', freq='H')).median()

答案 1 :(得分:1)

您可以将时间戳列向下舍入到最近的小时:

import math
df.time = [math.floor(t/3600) * 3600 for t in df.time]

甚至更简单,使用整数除法:

df.time = [(t//3600) * 3600 for t in df.time]

您可以按此列进行分组,从而保留时间戳。

答案 2 :(得分:0)

您是否尝试按以下方式创建小时栏:

data_frame['hour'] = data_frame.date.dt.hour

然后按小时分组,如:

data = data.groupby(data.hour).mean()