Python SumIfs для списка дат списка

У меня есть список списков, состоящих из дат в формате Excel с плавающей запятой (каждую минуту с 5 июля 1996 г.) и целочисленного значения, связанного с каждой датой, например: [[datetime,integer]...], Мне нужно создать новый список, состоящий из всех дат (без часов или минут) и суммы значений для всех дат в этой дате. Другими словами, какова сумма значений для каждой даты, когда listolists[x][0] >= math.floor(listolists[x][0]) а также listolists[x][0] < math.floor(listolists[x][0]), Спасибо

2 ответа

Поскольку вы не предоставили никаких фактических данных (только структуру данных, которую вы использовали, вложенные списки), я создал несколько фиктивных данных ниже, чтобы продемонстрировать, как вы можете сделать SUMIFSтип проблемы в Python.

from datetime import datetime
import numpy as np
import pandas as pd

dates_list = []

# just take one month as an example of how to group by day
year = 2015
month = 12

# generate similar data to what you might have
for day in range(1, 32):
    for hour in range(1, 24):
        for minute in range(1, 60):
            dates_list.append([datetime(year, month, day, hour, minute), np.random.randint(20)])

# unpack these nested list pairs so we have all of the dates in 
# one list, and all of the values in the other
# this makes it easier for pandas later
dates, values = zip(*dates_list)

# to eventually group by day, we need to forget about all intra-day data, e.g.
# different hours and minutes. we only care about the data for a given day, 
# not the by-minute observations. So, let's set all of the intra-day values to
# some constant for easier rolling-up of these dates.
new_dates = []

for d in dates:
    new_d = d.replace(hour = 0, minute = 0)
    new_dates.append(new_d)

# throw the new dates and values into a pandas.DataFrame object
df = pd.DataFrame({'new_dates': new_dates, 'values': values})

# here's the SUMIFS function you're looking for
grouped = df.groupby('new_dates')['values'].sum()

Давайте посмотрим на результаты:

>>> print(grouped.head())
new_dates
2015-12-01    12762
2015-12-02    13292
2015-12-03    12857
2015-12-04    12762
2015-12-05    12561
Name: values, dtype: int64

Редактировать: если вы хотите, чтобы эти новые сгруппированные данные вернулись в формате вложенного списка, просто сделайте это:

new_list = [[date, value] for date, value in zip(grouped.index, grouped)]

Спасибо всем. Это самый простой код, который я мог придумать, для которого не требуется панда:

for row in listolist:
     for k in (0, 1):
         row[k] = math.floor(float(row[k]))
date = {}
for d,v in listolist:
    if d in date:
        date[math.floor(d)].append(v)
    else:
        date[math.floor(d)] = [v]
result = [(d,sum(v)) for d,v in date.items()] 
Другие вопросы по тегам