2013-07-30 5 views
2

У меня есть следующие файлы 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])). Я исправил его в фрагменте выше, и пример теперь работает.

ответ

4

Я нашел, где проблема была в моем первоначальном решении.

В случае б), то

dates_by_month = map(strToMonthDate, arr[:,0]) 

возвращает список вместо Numpy массива. Индекс предварительной оценки:

group = arr[dates_by_month==key] 

поэтому не работает. Если вместо этого у меня есть:

dates_by_month = np.array(map(strToMonthDate, arr[:,0])) 

тогда группировка работает должным образом.

+0

Не стесняйтесь принимать свой ответ. Поэтому будущие пользователи, сталкивающиеся с одной и той же проблемой, могут использовать ваши знания. – Hyperboreus

+0

@Hyperboreus, спасибо, сделаю, я жду двухдневного лимита, прежде чем мне позволено принять за мой ответ. – frank

+1

@frank Я немного переформатировал ваш пост, пытаясь сделать его более легко выполнимым ... Не стесняйтесь настраивать/откатывать ... –

Смежные вопросы