Pandas TimeGrouper 并在 datetimeindex 上合并
Pandas TimeGrouper & Merge on datetimeindex
我是新手,我已经尝试查看多个帖子,但似乎无法正常工作...我确定是我的问题。
尝试合并和压缩两个数据集,一个有购买水果的日期和重量,另一个有历史每日价格。我正在尝试将这些压缩到每周一次。
我试图从中创建 Weights
的原始数据如下所示:
Date Product Weight
1-1-12 Strawberry 15
1-2-12 Bananna 56
1-2-12 Apple 98
1-5-12 Strawberry 115
1-5-12 Bananna 516
1-5-12 Apple 981
这是我尝试创建数据框但 returns 系列的代码:
df_GrossWeight = pd.read_csv('mydata.csv', encoding='utf-8')
df_GrossWeight_Indexed = df_GrossWeight.set_index(pd.DatetimeIndex(df_GrossWeight['Date']))
grouper = df_GrossWeight_Indexed.groupby([pd.TimeGrouper('W'),'Product'])
Weights = grouper['Weight'].sum()
我想将它与我创建的 Prices
列出每周价格的系列合并:
(datetimeindex) Product Price
2012-01-1 Strawberry 2.10
2012-01-1 Banana 0.55
2012-01-1 Apple 1.25
这是我使用的创建 Prices
的代码:
df_Price = pd.read_csv('Price_Hist.csv')
df_Indexed = df_Price.set_index(pd.DatetimeIndex(df_Price['Date']), drop = True)
df_Price_Indexed = df_Indexed['Price']
Prices = df_Price_Indexed.resample('W').mean()
我试图制作的最终数据框将包含我们购买的每周价格和每周总和。它看起来像这样:
(datetimeindex) Product Price Weight
2012-01-1 Strawberry 2.10 130
2012-01-1 Banana 0.55 572
2012-01-1 Apple 1.25 1079
我觉得这可以比我尝试的方法简单得多,因此非常感谢任何帮助。
提前谢谢你,
我
一种方法是 'round' 所有日期都精确到最近的工作日。一旦你有了这个 'rounded' 日期。您可以加入两个数据框。
df['Date'] = pd.to_datetime(df['Date'])
df2['(datetimeindex)'] = pd.to_datetime(df2['(datetimeindex)'])
四舍五入到最近的星期日
df2['Week_Sunday'] = df2['(datetimeindex)'] + pd.tseries.offsets.Week(weekday=6)
df['Week_Sunday'] = df.Date + pd.tseries.offsets.Week(weekday=6)
现在合并数据
df_all = pd.merge(df2, df, on = ['Week_Sunday', 'Product'])
print(df_all)
输出
(datetimeindex) Product Price Week_Sunday Date Weight
0 2012-01-01 Strawberry 2.10 2012-01-08 2012-01-01 15
1 2012-01-01 Strawberry 2.10 2012-01-08 2012-01-05 115
2 2012-01-01 Banana 0.55 2012-01-08 2012-01-02 56
3 2012-01-01 Banana 0.55 2012-01-08 2012-01-05 516
4 2012-01-01 Apple 1.25 2012-01-08 2012-01-02 98
5 2012-01-01 Apple 1.25 2012-01-08 2012-01-05 981
Groupby 和求和
df_all.groupby(['(datetimeindex)', 'Product', 'Price'], as_index=False)['Weight'].sum()
(datetimeindex) Product Price Weight
0 2012-01-01 Apple 1.25 1079
1 2012-01-01 Banana 0.55 572
2 2012-01-01 Strawberry 2.10 130
确保您的 Date
列是日期
Weights.Date = pd.to_datetime(Weights.Date)
还要确保修正香蕉错字。
我们可以使用 pd.merge_asof
来查找小于或等于目标日期的最近日期。
pd.merge_asof(
Weights, Prices, left_on=['Date'], right_on=['(datetimeindex)'], by='Product'
).groupby(
['(datetimeindex)', 'Product']
).agg(dict(Weight='sum', Price='mean')).reset_index()
(datetimeindex) Product Price Weight
0 2012-01-01 Apple 1.25 1079
1 2012-01-01 Banana 0.55 572
2 2012-01-01 Strawberry 2.10 130
我是新手,我已经尝试查看多个帖子,但似乎无法正常工作...我确定是我的问题。
尝试合并和压缩两个数据集,一个有购买水果的日期和重量,另一个有历史每日价格。我正在尝试将这些压缩到每周一次。
我试图从中创建 Weights
的原始数据如下所示:
Date Product Weight
1-1-12 Strawberry 15
1-2-12 Bananna 56
1-2-12 Apple 98
1-5-12 Strawberry 115
1-5-12 Bananna 516
1-5-12 Apple 981
这是我尝试创建数据框但 returns 系列的代码:
df_GrossWeight = pd.read_csv('mydata.csv', encoding='utf-8')
df_GrossWeight_Indexed = df_GrossWeight.set_index(pd.DatetimeIndex(df_GrossWeight['Date']))
grouper = df_GrossWeight_Indexed.groupby([pd.TimeGrouper('W'),'Product'])
Weights = grouper['Weight'].sum()
我想将它与我创建的 Prices
列出每周价格的系列合并:
(datetimeindex) Product Price
2012-01-1 Strawberry 2.10
2012-01-1 Banana 0.55
2012-01-1 Apple 1.25
这是我使用的创建 Prices
的代码:
df_Price = pd.read_csv('Price_Hist.csv')
df_Indexed = df_Price.set_index(pd.DatetimeIndex(df_Price['Date']), drop = True)
df_Price_Indexed = df_Indexed['Price']
Prices = df_Price_Indexed.resample('W').mean()
我试图制作的最终数据框将包含我们购买的每周价格和每周总和。它看起来像这样:
(datetimeindex) Product Price Weight
2012-01-1 Strawberry 2.10 130
2012-01-1 Banana 0.55 572
2012-01-1 Apple 1.25 1079
我觉得这可以比我尝试的方法简单得多,因此非常感谢任何帮助。
提前谢谢你, 我
一种方法是 'round' 所有日期都精确到最近的工作日。一旦你有了这个 'rounded' 日期。您可以加入两个数据框。
df['Date'] = pd.to_datetime(df['Date'])
df2['(datetimeindex)'] = pd.to_datetime(df2['(datetimeindex)'])
四舍五入到最近的星期日
df2['Week_Sunday'] = df2['(datetimeindex)'] + pd.tseries.offsets.Week(weekday=6)
df['Week_Sunday'] = df.Date + pd.tseries.offsets.Week(weekday=6)
现在合并数据
df_all = pd.merge(df2, df, on = ['Week_Sunday', 'Product'])
print(df_all)
输出
(datetimeindex) Product Price Week_Sunday Date Weight
0 2012-01-01 Strawberry 2.10 2012-01-08 2012-01-01 15
1 2012-01-01 Strawberry 2.10 2012-01-08 2012-01-05 115
2 2012-01-01 Banana 0.55 2012-01-08 2012-01-02 56
3 2012-01-01 Banana 0.55 2012-01-08 2012-01-05 516
4 2012-01-01 Apple 1.25 2012-01-08 2012-01-02 98
5 2012-01-01 Apple 1.25 2012-01-08 2012-01-05 981
Groupby 和求和
df_all.groupby(['(datetimeindex)', 'Product', 'Price'], as_index=False)['Weight'].sum()
(datetimeindex) Product Price Weight
0 2012-01-01 Apple 1.25 1079
1 2012-01-01 Banana 0.55 572
2 2012-01-01 Strawberry 2.10 130
确保您的 Date
列是日期
Weights.Date = pd.to_datetime(Weights.Date)
还要确保修正香蕉错字。
我们可以使用 pd.merge_asof
来查找小于或等于目标日期的最近日期。
pd.merge_asof(
Weights, Prices, left_on=['Date'], right_on=['(datetimeindex)'], by='Product'
).groupby(
['(datetimeindex)', 'Product']
).agg(dict(Weight='sum', Price='mean')).reset_index()
(datetimeindex) Product Price Weight
0 2012-01-01 Apple 1.25 1079
1 2012-01-01 Banana 0.55 572
2 2012-01-01 Strawberry 2.10 130