Итерировать по датам, вычислять средние значения для каждого 24-часового периода - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть CSV-файл с данными каждые две минуты в течение 2 лет, и я хочу запустить код для расчета 24-часовых средних.В идеале я хотел бы, чтобы код перебирал данные, вычислял средние значения и стандартные отклонения и R ^ 2 между dataA и dataB для каждого 24-часового периода, а затем выводил эти новые данные в новый CSV-файл (с меткой даты и рассчитанными данными длякаждый 24-часовой период).

Example the csv data

Данные имеют необычную временную метку, которая, я думаю, может слегка сбить меня с толку.Я пробовал разные циклы для циклов итерации по данным, но я не уверен, как указать, что я хочу получить средние значения и т. Д. Для каждого 24-часового периода.

Это код, который у меня есть до сих пор, но я не уверен, как выполнить цикл For Loop, чтобы добиться того, чего я хочу.Если кто-то может помочь, это было бы здорово!

import math
import pandas as pd
import os
import numpy as np
from datetime import timedelta, date

# read the file in csv
data = pd.read_csv("Jacaranda_data_HST.csv")

# Extract the data columns from the csv
data_date = data.iloc[:,1]
dataA  = data.iloc[:,2]
dataB  = data.iloc[:,3]

# set the start and end dates of the data
start_date = data_date.iloc[0]
end_date = data_date.iloc[-1:]

# for loop to run over every 24 hours of data
day_count = (end_date - start_date).days + 1
for single_date in [d for d in (start_date + timedelta(n) for n in 
range(day_count)) if d <= end_date]:
  print np.mean(dataA), np.mean(dataB), np.std(dataA), np.std(dataB)

# output new csv file - **unsure how to call the data** 
csvfile = "Jacaranda_new.csv"
outdf = pd.DataFrame()
#outdf['dataA_mean'] = ??
#outdf['dataB_mean'] = ??
#outdf['dataA_stdev'] = ??
#outdf['dataB_stdev'] = ??
outdf.to_csv(csvfile, index=False)

1 Ответ

0 голосов
/ 11 февраля 2019

Упрощенным подходом может быть группировка по календарному дню в dict.У меня нет большого опыта в pandas управлении временем в DataFrames, так что это может быть альтернативой.

Вы можете создать dict, где ключами являются даты данных (без временной части), чтобы позже можно было вычислить среднее значение всех точек данных, которые находятся под каждым ключом.

data_date = data.iloc[:,1]
data_a  = data.iloc[:,2]
data_b  = data.iloc[:,3]

import collections
dd_a = collections.defaultdict(list)
dd_b = collections.defaultdict(list)

for date_str, data_point_a, data_point_b in zip(data_date, data_a, data_b):
    # we split the string by the first space, so we get only the date part
    date_part, _ = date_str.split(' ', maxsplit=1)

    dd_a[date_part].append(data_point_a)
    dd_b[date_part].append(data_point_b)

Теперь вы можете рассчитать средние значения:

for date, v_list in dd_a.items():
    if len(v_list) > 0:
        print(date, 'mean:', sum(v_list) / len(v_list))
for date, v_list in dd_b.items():
    if len(v_list) > 0:
        print(date, 'mean:', sum(v_list) / len(v_list))
...