熊猫将每小时数据分组为带有日期索引的每日总和

acb*_*acb 5 python dataframe python-3.x pandas

我正在编写一个代码,该代码需要一个月的每小时数据并将其分组为24小时总和。我的问题是我希望索引读取日期/年份,而我刚得到的索引是1-30。

我正在使用的代码是

df = df.iloc[:,16:27].groupby([lambda x: x.day]).sum()
Run Code Online (Sandbox Code Playgroud)

我得到的输出示例

DateTime     data
1            1772.031568
2            19884.42243
3            28696.72159
4            24906.20355
5            9059.120325
Run Code Online (Sandbox Code Playgroud)

我想要的输出示例

DateTime     data
1/1/2017     1772.031568
1/2/2017     19884.42243
1/3/2017     28696.72159
1/4/2017     24906.20355
1/5/2017     9059.120325
Run Code Online (Sandbox Code Playgroud)

小智 9

这是一个老问题,但我认为在这种特殊情况下接受的解决方案不是最好的。您想要完成的是对时间序列数据进行下采样,Pandas 有内置的功能,称为resample()。对于您的示例,您将执行以下操作:

df = df.iloc[:,16:27].resample('D').sum()
Run Code Online (Sandbox Code Playgroud)

或者如果日期时间列不是索引

df = df.iloc[:,16:27].resample('D', on='datetime_column_name').sum()
Run Code Online (Sandbox Code Playgroud)

与接受的答案相比,这样做有(至少)两个好处:

  1. resample可以上采样和下采样,groupby()只能下采样
  2. 不需要 lambda、列表推导式或日期格式化函数。

有关更多信息和示例,请参阅此处的文档:resample()


Nic*_*ica 4

如果您的索引是 a datetime,您可以构建一个组合groupby子句:

df = df.iloc[:,16:27].groupby([lambda x: "{}/{}/{}".format(x.day, x.month, x.year)]).sum()
Run Code Online (Sandbox Code Playgroud)

甚至更好:

df = df.iloc[:,16:27].groupby([lambda x: x.strftime("%d%m%Y")]).sum()
Run Code Online (Sandbox Code Playgroud)