2017-10-29 152 views
1

我得有月,日的多指标,然后将数据值单列一大熊猫数据帧,看起来是这样的:大熊猫多指标在单柱月 - 日格式

 Data 
1 1  6 
    2  10 
    3  11 
    4  12 
    5  50 
    ... 
12 1 3 
    2 4 
    3 10 
    4 11 

你明白了。我已经把月份和日期分组了。 我想创建一个新的列,一起格式化Month-Date。但似乎无法弄清楚。 所需的输出会是这个样子:

M-D Data 
1-01 6 
1-02 10 
1-03 11 
1-04 14 
1-05 50 

任何人都可以为此提供最佳的解决方案? 注意:我之前使用下面的代码创建了索引,也许我需要回去做一些重构?我做了这个multiindex,以便我可以找到min()值。最初的“月”和“日”列在10年内有几个月和几天,我只需要这10年中的最小值,因此groupby()。

dframe['Date'] = pd.to_datetime(dframe['Date']) 
dframe['Month'], dframe['Day'] = dframe['Date'].dt.month, 
dframe['Date'].dt.day 
finaldf = dframe.groupby(['Month','Day'])['Data_Value'].min() 
df = pd.DataFrame(finaldf) 

在此先感谢!

回答

3

如果你需要的月份和日期被格式化为m-d,然后不给他们从一开始就分开是一种更合理的方法,例如,你可以通过这个变量格式化日期%m-%d,组办汇总您需要:

dframe.groupby(pd.to_datetime(dframe['Date']).dt.strftime('%m-%d'))['Data_Value'].min() 

简单例子

dframe = pd.DataFrame({ 
    'Date': ['2017-08-01', '2016-08-01', '2017-08-02'], 
    'Data_Value': [2,3,4] 
}) 

dframe.groupby(pd.to_datetime(dframe['Date']).dt.strftime('%m-%d'))['Data_Value'].min() 

#Date 
#08-01 2 
#08-02 4 
#Name: Data_Value, dtype: int64 
+0

这个工作完全我需要它的方式。这是我第一次使用这么大数量的日期时间数据,所以非常感谢。 –

0

这是一个有点棘手与多指标的工作,我不知道,这是非常有效的时间,但它的工作原理:

df["M-D"] = [str(df.index[i][0])+'-'+str(df.index[i][1]) for i in range(len(df))] 

它提供了以下结果:

In[143]: df.head() 
Out[143]: 
      Open New_date 
Month Day    
1  1 9597  1-1 
     2 9370  1-2 
     3 9365  1-3 
     4 9766  1-4 
     5 9446  1-5 
2

我会请@ Psidom的建议。但是,要解决有人问这样的问题:
我会使用format

df.assign(**{'M-D': df.index.map('{0[0]}-{0[1]}'.format).rename('M-D')}) 

     Data M-D 
1 1  6 1-1 
    2 10 1-2 
    3 11 1-3 
    4 12 1-4 
    5 50 1-5 
12 1  3 12-1 
    2  4 12-2 
    3 10 12-3 
    4 11 12-4 

设置

df = pd.DataFrame(dict(
    Data=[6, 10, 11, 12, 50, 3, 4, 10, 11], 
), [[1] * 5 + [12] * 4, list(range(1, 6)) + list(range(1, 5))])