Pandas将每小时数据分组为日期指数

时间:2017-03-06 16:08:55

标签: python python-3.x pandas dataframe

我正在制作一个代码,该代码每小时收集一小时数据,并将其分为24小时总和。我的问题是,我希望索引读取日期/年,我只是得到1-30的索引。

我正在使用的代码是

df = df.iloc[:,16:27].groupby([lambda x: x.day]).sum()

输出示例

DateTime     data
1            1772.031568
2            19884.42243
3            28696.72159
4            24906.20355
5            9059.120325

我想要的输出示例

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

5 个答案:

答案 0 :(得分:2)

如果您的索引是datetime,则可以构建合并的groupby子句:

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

甚至更好:

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

答案 1 :(得分:1)

如果您的索引不是datetime对象。

import pandas as pd
df = pd.DataFrame({'data': [1772.031568, 19884.42243,28696.72159, 24906.20355,9059.120325]},index=[1,2,3,4,5])
print df.head()
rng = pd.date_range('1/1/2017',periods =len(df.index), freq='D')
df.set_index(rng,inplace=True)
print df.head()

将导致

           data
1   1772.031568
2  19884.422430
3  28696.721590
4  24906.203550
5   9059.120325
                    data
2017-01-01   1772.031568
2017-01-02  19884.422430
2017-01-03  28696.721590
2017-01-04  24906.203550
2017-01-05   9059.120325

答案 2 :(得分:1)

首先,您需要在日期时间列上创建一个索引,以便有效地将日期时间细分为较小的部分(类似于日期时间的年份和月份)。

接下来,如果要将聚合方法(如sum())应用于一年中的每一天,并且每天保留单独的聚合,则需要按索引的年,月和日进行分组。

reset_index()rename()功能允许我们将 group_by 类别重命名为原始名称。这会“压平”我们的数据,使得该类别成为结果数据框的实际列。

import pandas as pd

date_index = pd.DatetimeIndex(df.created_at)
# 'df.created_at' is the datetime column in your dataframe
counted = df.group_by([date_index.year, date_index.month, date_index.day])\
            .agg({'column_to_sum': 'sum'})\
            .reset_index()\
            .rename(columns={'level_1': 'year',
                             'level_2': 'month',
                             'level_3': 'day'})

# Resulting dataframe has columns "column_to_sum", "year", "month", "day" available

答案 3 :(得分:0)

您可以利用熊猫DatetimeIndex

working_df=df.iloc[:, 16:27]
result = working_df.groupby(pd.DatetimeIndex(working_df.DateTime)).date).sum()

如果您的DateTime列实际上是DateTime(并注意时区)。

通过这种方式,您将在索引中拥有有效的日期时间,以便您可以轻松地进行其他操作。

答案 4 :(得分:0)

这是一个古老的问题,但是在这种情况下,我认为公认的解决方案不是最好的。您要完成的工作是缩减时间序列数据的样本,Pandas为此提供了内置功能resample()。对于您的示例,您将执行以下操作:

df = df.iloc[:,16:27].resample('D').sum()

或者如果datetime列不是索引

df = df.iloc[:,16:27].resample('D', on='datetime_column_name').sum()

与接受的答案相比,以这种方式(至少)有2个好处:

  1. 重采样可以增加采样和减少采样,groupby()仅可以减少采样
  2. 不需要lambda,列表推导或日期格式设置功能。<​​/ li>

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