У меня есть следующие файлы CSV:Python разделить список DateTimes на год + месяц
# simulate a csv file
from StringIO import StringIO
data = StringIO("""
2012-04-01,00:10, A, 10
2012-04-01,00:20, B, 11
2012-04-01,00:30, B, 12
2012-04-02,00:10, A, 18
2012-05-02,00:20, A, 14
2012-05-02,00:30, B, 11
2012-05-03,00:10, A, 10
2012-06-03,00:20, B, 13
2012-06-03,00:30, C, 12
""".strip())
, который я хотел бы gropu в год + месяц плюс категории (то есть A, B, C)..
Я хотел бы окончательные данные, чтобы группировать по месяцам, а затем по категориям как вид исходных данных
2012-04, A
>> array[0,] => 2012-04-01,00:10, A, 10
>> array[3,] => 2012-04-02,00:10, A, 18
2012-04, B
>> array[1,] => 2012-04-01,00:20, B, 11
>> array[2,] => 2012-04-01,00:30, B, 12
2012-05, A
>> array[4,] => 2012-05-02,00:20, A, 14
...
И тогда для каждой группы, я хотел бы итерацию построить их, используя тот же функция.
Я видел подобный вопрос о расщеплении по датам по дням Split list of datetimes into days и я могу так в моем случае). Но некоторые проблемы превращают это в год + месяц в случае б).
Вот фрагмент кода, который я до сих пор с проблемой, что я бегу в:
#! /usr/bin/python
import numpy as np
import csv
import os
from datetime import datetime
def strToDate(string):
d = datetime.strptime(string, '%Y-%m-%d')
return d;
def strToMonthDate(string):
d = datetime.strptime(string, '%Y-%m-%d')
d_by_month = datetime(d.year,d.month,1)
return d_by_month;
# simulate a csv file
from StringIO import StringIO
data = StringIO("""
2012-04-01,00:10, A, 10
2012-04-01,00:20, B, 11
2012-04-01,00:30, B, 12
2012-04-02,00:10, A, 18
2012-05-02,00:20, A, 14
2012-05-02,00:30, B, 11
2012-05-03,00:10, A, 10
2012-06-03,00:20, B, 13
2012-06-03,00:30, C, 12
""".strip())
arr = np.genfromtxt(data, delimiter=',', dtype=object)
# a) If we were to just group by dates
# Get unique dates
#keys = np.unique(arr[:,0])
#keys1 = np.unique(arr[:,2])
# Group by unique dates
#for key in keys:
# print key
# for key1 in keys1:
# group = arr[ (arr[:,0]==key) & (arr[:,2]==key1) ]
# if group.size:
# print "\t" + key1
# print group
# print "\n"
# b) But if we want to group by year+month in the dates
dates_by_month = np.array(map(strToMonthDate, arr[:,0]))
keys2 = np.unique(dates_by_month)
print dates_by_month
# >> [datetime.datetime(2012, 4, 1, 0, 0), datetime.datetime(2012, 4, 1, 0, 0), ...
print "\n"
print keys2
# >> [2012-04-01 00:00:00 2012-05-01 00:00:00 2012-06-01 00:00:00]
for key in keys2:
print key
print type(key)
group = arr[dates_by_month==key]
print group
print "\n"
Вопрос: Я получаю ежемесячно ключ, но и для группы, все это я получаю [2012- 04-01 00:10 A 10] для каждой группы. ключ в key2 имеет тип datetime.datetime. Любая идея, что может быть неправильным? Любые предложения по альтернативным вариантам приветствуются. Я бы предпочел не использовать решение itertools.groupby, поскольку он возвращает итератор, а не массив, который менее подходит для построения графика.
Редактировать 1: Проблема решена. Проблема заключалась в том, что date_by_month, который я использовал для предварительной индексации в случае b), должен быть инициализирован как np.array, а не список, который возвращает date_by_month = np.array (map (strToMonthDate, arr [:, 0])). Я исправил его в фрагменте выше, и пример теперь работает.
Не стесняйтесь принимать свой ответ. Поэтому будущие пользователи, сталкивающиеся с одной и той же проблемой, могут использовать ваши знания. – Hyperboreus
@Hyperboreus, спасибо, сделаю, я жду двухдневного лимита, прежде чем мне позволено принять за мой ответ. – frank
@frank Я немного переформатировал ваш пост, пытаясь сделать его более легко выполнимым ... Не стесняйтесь настраивать/откатывать ... –