2017-01-11 20 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 

即:指数每个日期按月,相对于一年也。

我不知道该怎么做,也找不到类似的问题,所以建议不胜感激。 35~~~~~~~~~~~~~~~~~~~~~~~~~ 编辑: 回复@Psidom。 只是一个数字组成的数据集。在我正在处理的实际数据集中,我将日期转换为日期时间对象。

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岁开始还是更小一些?这是一个字符串或日期时间对象的列表? – 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

下面是使用数据视为给定的生产要求的答案,包括0失踪monthes不同的答案。

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