如何使用熊猫按 10 分钟对时间序列进行分组
Posted
技术标签:
【中文标题】如何使用熊猫按 10 分钟对时间序列进行分组【英文标题】:How to groupby time series by 10 minutes using pandas 【发布时间】:2015-11-15 19:20:50 【问题描述】:有一个由 DatatimeIndex 索引的时间序列(ts),想按 10 分钟分组
index x y z
ts1 ....
ts2 ....
...
我知道如何按 1 分钟分组
def group_by_minute(timestamp):
year = timestamp.year
month = timestamp.month
day = timestamp.day
hour = timestamp.hour
minute = timestamp.minute
return datetime.datetime(year, month, day, hour, minute)
然后
ts.groupby(group_by_minute, axis=0)
我的自定义函数(大致)
def my_function(group):
first_latitude = group['latitude'].sort_index().head(1).values[0]
last_longitude = group['longitude'].sort_index().tail(1).values[0]
return first_latitude - last_longitude
所以 ts DataFrame 肯定应该包含 'latitude' 和 'longitude' 列
使用 TimeGrouper 时
ts.groupby(pd.TimeGrouper(freq='100min')).apply(my_function)
我收到以下错误,
TypeError: cannot concatenate a non-NDFrame object
【问题讨论】:
你试过resample
吗?例如。 df.resample('1min', 'mean')
你在做什么聚合
@JoeCondron 我正在使用 APPLY 函数应用自定义函数。在我看来, resample 或 TimeGrouper 会自动填补空白,即使有一年的时间间隔。有没有办法防止这种情况?非常感谢
您可以传递您的自定义函数,例如:df.resample('10min', how=my_func)
。除非你告诉它,否则它不会填补空白。也许您应该发布要传递的功能和所需的输出。或者,您可以将函数的最后一行调整为 minute = 10 * (minute / 10)
。
@JoeCondron 感谢您的建议。我已经切换到重新采样,它几乎可以工作。仅 resample 获取 df 的第一列,它是否同时适用于 df 的多个列?我会将我的功能重新编辑到问题中。再次感谢
【参考方案1】:
我知道这是旧的,但 pd.Grouper() 也会完成这个:
agg_10m = df.groupby(pd.Grouper(freq='10Min')).aggregate(numpy.sum)
【讨论】:
现在是 Grouper,因为旧的已弃用。【参考方案2】:这种事情有一个pandas.TimeGrouper
,你描述的会是这样的:
agg_10m = df.groupby(pd.TimeGrouper(freq='10Min')).aggregate(numpy.sum) #or other function
【讨论】:
感谢您的回复。似乎 pd.TimeGrouper 确实存在,但这里没有记录pandas.pydata.org/pandas-docs/stable/api.html 哎呀,你是对的。永远不要注意到它是无证的。 通过应用 TimeGrouper 获得“TypeError: cannot concatenate a non-NDFrame object” TimeGrouper 有一定的记录——它在食谱中 pandas.pydata.org/pandas-docs/stable/cookbook.html#resampling 这很奇怪,但它似乎没有被覆盖。 pandas.pydata.org/pandas-docs/stable/… 是时间分组的规范方法;这会创建一个本身不公开的 TimeGrouper以上是关于如何使用熊猫按 10 分钟对时间序列进行分组的主要内容,如果未能解决你的问题,请参考以下文章