2017-01-11 6 views
1

Я хотел бы преобразовать список дат в следующем формате:Группировка дат с индексом в Python

01-02-12 
01-03-12 
01-27-12 
02-01-12 
02-23-12 
    . 
    . 
    . 
01-03-13 
02-02-13 

в

1 
1 
1 
2 
2 
. 
. 
. 
13 
14 

т.е. индекс каждой дате по месяцу, по году также.

Я не уверен, как это сделать и не может найти аналогичную проблему, поэтому совет будет оценен. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Редактировать: В ответ на @Psidom. Просто пример набора данных с составленными номерами. В фактическом наборе данных, с которым я имею дело, я преобразовал даты в объекты datetime.

dat = pd.read_csv('matchdata-update.csv',encoding = "ISO-8859-1") 
dat['Date']=pd.to_datetime(dat['Date'],format='%m-%d-%y% I:%M%p'). 

В идеале, я бы хотел, чтобы он считался месяцем, даже если он не наблюдался. Конечная цель - индексировать каждый месяц и подсчитывать количество строк в этом insex, поэтому, если месяц не был замечен, количество строк, подсчитываемых для этого индекса, будет всего 0.

+1

Так год всегда начинается с 12? И что, если в течение года отсутствуют месяцы, как бы вы рассчитывали в следующем году, все еще начинается с 13 или чего-то меньшего? Также это список объектов string или datetime? – Psidom

+0

http://stackoverflow.com/questions/4039879/best-way-to-find-the-months-between-two-dates – DaveQ

ответ

1

Если вы хотите посчитать количество строки для каждого месяца, это должно работать:

dat.set_index("Date").resample("M").size() 
+1

Отличная работа. Я обещаю начать возвращать одолжение, когда буду больше скорости. – Luke

+0

Приятно слышать. Но вам не обязательно чувствовать себя обязанным, хороший вопрос может принести пользу тем, у кого такая же проблема. – Psidom

1

Вот другой ответ, используя данные, как указано и продюсерский ответ просил, в том числе 0s для недостающих месяцев.

dates = '''\ 
01-02-12 
01-03-12 
01-27-12 
02-01-12 
02-23-12 
01-03-13 
02-02-13 
'''.splitlines() 

def monthnum(date, baseyear): 
    "Convert date as 'mm-dd-yy' to month number starting with baseyear xx." 
    m,d,y = map(int, date.split('-')) 
    return m + 12 * (y-baseyear) 

print(monthnum(dates[0], 12) == 1, monthnum(dates[-1], 12) == 14) 

def monthnums(dates, baseyear): 
    "Yield month numbers of 'mm-dd-yy' starting with baseyear." 
    for date in dates: 
     m,d,y = map(int, date.split('-')) 
     yield m + 12 * (y-baseyear) 

print(list(monthnums(dates, 12)) == [1,1,1,2,2,13,14]) 

def num_per_month(mnums): 
    prev, n = 1, 0 
    for k in mnums: 
     if k == prev: 
      n += 1 
     else: 
      yield prev, n 
      for i in range(prev+1, k): 
       yield i, 0 
      prev, n = k, 1 
    yield prev, n 

for m, n in num_per_month(monthnums(dates, 12)): 
    print(m, n) 

печатает

True True 
True 
1 3 
2 2 
3 0 
4 0 
5 0 
6 0 
7 0 
8 0 
9 0 
10 0 
11 0 
12 0 
13 1 
14 1 
Смежные вопросы