从python

时间:2018-03-14 10:39:21

标签: python database pandas dataframe

我有3000个原始数据随时间和消耗的能量。但这个能源价值是累计金额,我需要得到每个月的每月消费价值 我想知道如何循环同月的数据并从同月的第一个值中减去每个月的最后一个值。 我每个月的数据数量与其他月份不同。此列表的第一个值如下:

Time             Energy

2017-01-01                0.0
2017-01-01      456682295.279
2017-01-01      576253341.508
2017-01-01      693234839.384
2017-01-02      810613281.137
2017-01-02      928960004.805
.
.
.

3 个答案:

答案 0 :(得分:0)

如果您的数据采用数据框格式。然后可以按时间变量对数据进行分组。

考虑您的数据是变量 df 。将您的Time变量转换为字符串,只占用它的7个字符,以便它只代表月份

df=df.drop(df.index[0]) 
df.columns= ["Time","Energy"] 
df['Time']= df["Time"].map(lambda x: x[:7])  # Should be of form yyyy-mm


def diff(x):
    return max(x) - min(x)

df.groupby(["Time"]).agg(diff)

答案 1 :(得分:0)

您可以按月分组并使用pd.TimeGrouper。这是一个简单的例子。

<强>设置

df = pd.DataFrame({'Time': ['2017-01-01', '2017-01-01', '2017-01-02', '2017-01-02',
                            '2017-02-01', '2017-02-01', '2017-02-02', '2017-02-02',
                            '2017-03-01', '2017-03-01', '2017-03-02', '2017-03-02'],
                   'Energy': list(range(12))})

df['Time'] = pd.to_datetime(df['Time'])

<强>解决方案

res = df.set_index('Time').sort_index()
res = res.groupby(pd.TimeGrouper('M')).nth(0).reset_index()   
res['Monthly'] = res['Energy'].diff().fillna(0)

<强>结果

        Time  Energy  Monthly
0 2017-01-31       0      0.0
1 2017-02-28       4      4.0
2 2017-03-31       8      4.0

答案 2 :(得分:0)

你可以试试这个。

import itertools


for item, group in itertools.groupby(data, lambda x: x["Time"][:7]):
    total = sum([each_item["Energy"] for each_item in group]) # Here you sum

UPD:循环分组,你只能迭代一次。