Python 将时间戳转换为TimeGrouper频率组

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

我有一个带有日期时间索引的熊猫数据框。 当使用时间grouper对其进行分组时:
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”)