如何使用带有 Pandas 的时间戳按小时对数据帧进行分组
Posted
技术标签:
【中文标题】如何使用带有 Pandas 的时间戳按小时对数据帧进行分组【英文标题】:How to group dataframe by hour using timestamp with Pandas 【发布时间】:2018-08-15 20:35:53 【问题描述】:我有以下使用时间戳索引的数据帧结构:
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
但我不知道如何保留考虑到 grouby 开始的时间的时间戳。
【问题讨论】:
【参考方案1】:您是否尝试通过以下方式创建小时列:
data_frame['hour'] = data_frame.date.dt.hour
然后按小时分组:
data = data.groupby(data.hour).mean()
【讨论】:
是的,这给了我和我现在一样的结果。问题是保持/生成小时开始的时间戳。【参考方案2】:您可以将时间戳列向下舍入到最接近的小时:
import math
df.time = [math.floor(t/3600) * 3600 for t in df.time]
或者更简单,使用整数除法:
df.time = [(t//3600) * 3600 for t in df.time]
您可以按此列分组,从而保留时间戳。
【讨论】:
我怎么没想到这个?这完美地工作,这样一个简单而优雅的解决方案。谢谢!【参考方案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()
如果您不想将时间作为索引,也可以使用 groupby
和 Grouper
:
df = pd.DataFrame('val':values, 'times':times)
df.groupby(pd.Grouper(level='times', freq='H')).median()
【讨论】:
非常简洁的答案以上是关于如何使用带有 Pandas 的时间戳按小时对数据帧进行分组的主要内容,如果未能解决你的问题,请参考以下文章