Python 基于较小日期范围对大熊猫数据帧求和

Python 基于较小日期范围对大熊猫数据帧求和,python,pandas,Python,Pandas,我有一个大熊猫数据框,它每小时都有相关的数据。然后我想将其解析为“每月”数据,将每小时的数据相加。然而,月份不一定是日历月份,它们通常在一个月中旬开始,并在下个月中旬结束。p> 我可以建立一个“月”的列表,每个日期范围都在其中循环,但我认为有更好的方法通过熊猫来实现这一点 这是我当前的代码,最后一行抛出一个错误,这是问题的关键: dates = pd.Series(pd.date_range('1/1/2015 00:00','3/31/2015 23:45',freq='1H')) nums

我有一个大熊猫数据框,它每小时都有相关的数据。然后我想将其解析为“每月”数据,将每小时的数据相加。然而,月份不一定是日历月份,它们通常在一个月中旬开始,并在下个月中旬结束。p> 我可以建立一个“月”的列表,每个日期范围都在其中循环,但我认为有更好的方法通过熊猫来实现这一点

这是我当前的代码,最后一行抛出一个错误,这是问题的关键:

dates = pd.Series(pd.date_range('1/1/2015 00:00','3/31/2015 23:45',freq='1H'))
nums = np.random.randint(0,100,dates.count())
df = pd.DataFrame({'date':dates, 'num':nums})

month = pd.DataFrame({'start':['1/4/2015 00:00','1/24/2015 00:00'], 'end':['1/23/2015 23:00','2/23/2015 23:00']})
month['start'] = pd.to_datetime(month['start'])
month['end'] = pd.to_datetime(month['end'])

month['num'] = df['num'][(df['date'] >= month['start']) & (df['date'] <= month['end'])].sum()
当然,我不明白。

pd.merge\u asof
仅适用于熊猫0.19
+的组合

pd.merge\u asof(df,month,left\u on='date',right\u on='start')\
.query('date
pd.merge\u asof
仅适用于pandas 0.19

+的组合

pd.merge\u asof(df,month,left\u on='date',right\u on='start')\

.query('date也许您可以转换为句点并添加天数

# create data
dates = pd.Series(pd.date_range('1/1/2015 00:00','3/31/2015 23:45',freq='1H'))
nums = np.random.randint(0,100,dates.count())
df = pd.DataFrame({'date':dates, 'num':nums})

# offset days and then create period
df['periods'] = (df.date + pd.tseries.offsets.Day(23)).dt.to_period('M')]

# group and sum
df.groupby('periods')['num'].sum()
输出

periods
2015-01    10051
2015-02    34229
2015-03    37311
2015-04    26655

然后,您可以将日期向后移动并创建新列

也许您可以将日期转换为句点并添加天数

# create data
dates = pd.Series(pd.date_range('1/1/2015 00:00','3/31/2015 23:45',freq='1H'))
nums = np.random.randint(0,100,dates.count())
df = pd.DataFrame({'date':dates, 'num':nums})

# offset days and then create period
df['periods'] = (df.date + pd.tseries.offsets.Day(23)).dt.to_period('M')]

# group and sum
df.groupby('periods')['num'].sum()
输出

periods
2015-01    10051
2015-02    34229
2015-03    37311
2015-04    26655

然后,您可以将日期向后移动并创建新列

尝试查看pd.tseries.offset.Month,查看是否有开始日期并按该日期重新采样。如果没有开始日期,请添加所需月份的时间增量。尝试查看pd.tseries.offset.Month,查看是否有开始日期并按该日期重新采样。如果没有开始日期,请添加时间增量你想要的月日增量。我得到:
'module'对象没有属性“merge\u asof”
这是熊猫0.19的特性。如果你不能升级,我们必须找到另一个解决方案始终是@piRSquared-你是一行之王。非常感谢!@pshep123帽子在哪里?我得到:
'module'对象没有属性“merge_asof”
这是熊猫0.19的一项功能。如果您无法升级,我们将不得不找到另一种解决方案@piRSquared-您是一行之王。非常感谢!@pshep123那顶帽子在哪里?