我正在制作一个代码,该代码每小时收集一小时数据,并将其分为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
答案 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个好处:
有关更多信息和示例,请参见此处的文档:resample()