Python 将时间戳转换为TimeGrouper频率组
我有一个带有日期时间索引的熊猫数据框。 当使用时间grouper对其进行分组时:Python 将时间戳转换为TimeGrouper频率组,python,pandas,group-by,time-series,datetimeindex,Python,Pandas,Group By,Time Series,Datetimeindex,我有一个带有日期时间索引的熊猫数据框。 当使用时间grouper对其进行分组时:pd.grouper(freq='360Min'),如何将此结果加入到原始时间戳中? 即,等联接时间戳=存储桶不工作? 有便利功能吗? 是否应使用asof连接? 或者我必须手动提取小时数,然后尝试匹配它 例子: 为了一个来源 import pandas as pd df = pd.DataFrame( { "Publish date": [ pd.Tim
pd.grouper(freq='360Min')
,如何将此结果加入到原始时间戳中?
即,等联接时间戳=存储桶不工作?
有便利功能吗?
是否应使用asof
连接?
或者我必须手动提取小时数,然后尝试匹配它
例子:
为了一个来源
import pandas as pd
df = pd.DataFrame(
{
"Publish date": [
pd.Timestamp("2000-01-02"),
pd.Timestamp("2000-01-02"),
pd.Timestamp("2000-01-09"),
pd.Timestamp("2000-01-16")
],
"ID": [0, 1, 2, 3],
"Price": [10, 20, 30, 40]
}
)
其中:
Publish date ID Price
0 2000-01-02 0 10
1 2000-01-02 1 20
2 2000-01-09 2 30
3 2000-01-16 3 40
我希望以任意频率执行聚合(不仅仅是月、日、小时),比如说1
month.
agg_result = df.groupby(pd.Grouper(key="Publish date", freq="1M")).agg([pd.Series.mean, pd.Series.median]).reset_index()
agg_result.columns = ['_'.join(col).strip() for col in agg_result.columns.values]
agg_result.columns = ['Publish date month', 'ID_mean', 'ID_median', 'Price_mean', 'Price_median']
print(agg_result)
Publish date month ID_mean ID_median Price_mean Price_median
0 2000-01-31 1.5 1.5 25 25
如何确保equijoin再次工作?即,使用相同的任意频率将原始时间戳转换为拟合桶
即,如示例代码所述,我如何获得:
agg_result['Publish date month'] = agg_result['Publish date'].apply(magic transform to same frequency bucket)
df.merge(agg_result, on['Publish date month'])
要工作,即定义到正确存储桶的转换?编辑:
确定每组对应原始值的最简单方法应为:
gb = df.groupby(pd.Grouper(key="Publish date", freq="1M"))
dict(list(gb['Publish date']))
然后,您可以使用它将任何信息连接回原始表
你能在两个中间柱上连接吗
df['Publish date'].dt.month
及
像这样
results = df.groupby(pd.Grouper(key="Publish date", freq="1M")).agg([pd.Series.mean, pd.Series.median])
results.columns = ['-'.join(col[::-1]).strip() for col in results.columns]
df['month'] = df['Publish date'].dt.month
results['month'] = results.index.month
results.merge(df)
编辑:
确定每组对应原始值的最简单方法应为:
gb = df.groupby(pd.Grouper(key="Publish date", freq="1M"))
dict(list(gb['Publish date']))
然后,您可以使用它将任何信息连接回原始表
你能在两个中间柱上连接吗
df['Publish date'].dt.month
及
像这样
results = df.groupby(pd.Grouper(key="Publish date", freq="1M")).agg([pd.Series.mean, pd.Series.median])
results.columns = ['-'.join(col[::-1]).strip() for col in results.columns]
df['month'] = df['Publish date'].dt.month
results['month'] = results.index.month
results.merge(df)
我会使用
Groupby.transform
方法:
将熊猫作为pd导入
df=pd.DataFrame(
{
“发布日期”:[
pd.时间戳(“2000-01-02”),
pd.时间戳(“2000-01-02”),
pd.时间戳(“2000-01-09”),
pd.时间戳(“2000-01-16”)
],
“ID”:[0,1,2,3],
“价格”:[10,20,30,40]
}
)
g=df.groupby(pd.Grouper(key=“Publish date”,freq=“1M”))
(
df.join(g.transform('mean'),rsuffix='u mean')
.join(g.transform('median'),rsuffix='u median')
)
这就返回了:
Publish date ID Price ID_mean Price_mean ID_median Price_median
0 2000-01-02 0 10 1.5 25 1.5 25
1 2000-01-02 1 20 1.5 25 1.5 25
2 2000-01-09 2 30 1.5 25 1.5 25
3 2000-01-16 3 40 1.5 25 1.5 25
您还可以使用pandas.concat
代替DataFrame.join
:
methods=['mean','median','std','min','max']
海螺([
df,*[g.transform(m).在方法中为m添加_后缀(f'.{m}')]
],axis='columns')
这就给了你:
Publish date ID Price ID_mean Price_mean ID_median Price_median ID_std Price_std ID_min Price_min ID_max Price_max
0 2000-01-02 0 10 1.5 25 1.5 25 1.290994 12.909944 0 10 3 40
1 2000-01-02 1 20 1.5 25 1.5 25 1.290994 12.909944 0 10 3 40
2 2000-01-09 2 30 1.5 25 1.5 25 1.290994 12.909944 0 10 3 40
3 2000-01-16 3 40 1.5 25 1.5 25 1.290994 12.909944 0 10 3 40
我会使用
Groupby.transform
方法:
将熊猫作为pd导入
df=pd.DataFrame(
{
“发布日期”:[
pd.时间戳(“2000-01-02”),
pd.时间戳(“2000-01-02”),
pd.时间戳(“2000-01-09”),
pd.时间戳(“2000-01-16”)
],
“ID”:[0,1,2,3],
“价格”:[10,20,30,40]
}
)
g=df.groupby(pd.Grouper(key=“Publish date”,freq=“1M”))
(
df.join(g.transform('mean'),rsuffix='u mean')
.join(g.transform('median'),rsuffix='u median')
)
这就返回了:
Publish date ID Price ID_mean Price_mean ID_median Price_median
0 2000-01-02 0 10 1.5 25 1.5 25
1 2000-01-02 1 20 1.5 25 1.5 25
2 2000-01-09 2 30 1.5 25 1.5 25
3 2000-01-16 3 40 1.5 25 1.5 25
您还可以使用pandas.concat
代替DataFrame.join
:
methods=['mean','median','std','min','max']
海螺([
df,*[g.transform(m).在方法中为m添加_后缀(f'.{m}')]
],axis='columns')
这就给了你:
Publish date ID Price ID_mean Price_mean ID_median Price_median ID_std Price_std ID_min Price_min ID_max Price_max
0 2000-01-02 0 10 1.5 25 1.5 25 1.290994 12.909944 0 10 3 40
1 2000-01-02 1 20 1.5 25 1.5 25 1.290994 12.909944 0 10 3 40
2 2000-01-09 2 30 1.5 25 1.5 25 1.290994 12.909944 0 10 3 40
3 2000-01-16 3 40 1.5 25 1.5 25 1.290994 12.909944 0 10 3 40
但这只在一个月内有效。不是在提供4小时作为频率的时候。啊,明白了-这是有道理的。我想您仍然可以查看组df.groupby(pd.Grouper(key=“Publish date”,freq=“1M”))。组,然后查找包含的日期/时间。df.groupby(pd.Grouper(key=“Publish date”,freq=“1M”)).get_group(pd.Timestamp('2000-01-31 00:00:00',freq='M'))来构建联接键。我将遵循这一点,看看是否有人有更好的方法来做它。@GeorgHeiler请查看我的编辑,以获得更直接的方法。也很好。两者都适用于小数据,但在实际数据上都失败;)但原则上,他们解决了问题。由于这一个使用较少的联接,我想这一个可能会更受欢迎,我会将其标记为已接受。@GeorgHeiler谢谢。你面临的错误是什么?是在groupby agg函数期间还是在join期间?如果是连接,您可以尝试创建一个自定义groupby函数,以返回包含聚合信息(例如,中值、平均值)的组以及组本身。如果您提供一个一行程序来创建从numpy生成的随机数据集,但仍然会给您带来错误,我很乐意看一看。但这只适用于一个月的情况。不是在提供4小时作为频率的时候。啊,明白了-这是有道理的。我想您仍然可以查看组df.groupby(pd.Grouper(key=“Publish date”,freq=“1M”))。组,然后查找包含的日期/时间。df.groupby(pd.Grouper(key=“Publish date”,freq=“1M”)).get_group(pd.Timestamp('2000-01-31 00:00:00',freq='M'))来构建联接键。我将遵循这一点,看看是否有人有更好的方法来做它。@GeorgHeiler请查看我的编辑,以获得更直接的方法。也很好。两者都适用于小数据,但在实际数据上都失败;)但原则上,他们解决了问题。由于这一个使用较少的联接,我想这一个可能会更受欢迎,我会将其标记为已接受。@GeorgHeiler谢谢。你面临的错误是什么?是在groupby agg函数期间还是在join期间?如果是连接,您可以尝试创建一个自定义groupby函数,以返回包含聚合信息(例如,中值、平均值)的组以及组本身。如果您提供一个一行程序来从numpy创建一个随机数据集构建,但仍然会给您带来错误,我很乐意看一看。很好,但是如果我想保留列表(可以灵活地作为函数参数传递),是否可以单次构建
df.join.transform(xxxx)
?@GeorgHeiler是的,您可以将concat
与列表压缩一起使用。请参见edit.Neat。但我猜下面的注释是df.groupby(pd.Grouper(key=“Publish date”,freq=“1M”))get_group(pd.Timestamp('2000-01-31 00:00:00',freq=“100”)