从隐藏在多索引中的年月创建日期时间

Posted

技术标签:

【中文标题】从隐藏在多索引中的年月创建日期时间【英文标题】:Create Datetime from year and month hidden in multi-index 【发布时间】:2017-01-17 15:17:15 【问题描述】:

我有一个数据框,其中年份和月份隐藏在 multi-index 中。我想创建一个日期时间索引作为附加列(或具有相同索引的单独系列)。

                                           price            
                                            mean     mom_2  
foo          bar              year month                                      
997182819645 11               2010 1      1.1900  3.000000  
                                   2      2.2625  4.001769  

我想将两个级别的索引作为字符串添加在一起,然后按该顺序读入pd.to_datetime()。但是,添加这两个索引时,我遇到了问题。我可以将它们添加为整数就好了,但是如果我想将它们添加为字符串,我会遇到一些错误:

In[193]: df.index.get_level_values('year').values.astype(str)
Out[193]: 

array(['2010', '2010', '2010', ..., '2014', '2014', '2014'], 
      dtype='<U21')
In[194]: df.index.get_level_values('month').values.astype(str)
Out[194]: 

array(['1', '2', '3', ..., '10', '11', '12'], 
      dtype='<U21')
In[195]: df.index.get_level_values('month').values.astype(str) + df.index.get_level_values('year').values.astype(str)

TypeError: ufunc 'add' did not contain a loop with signature matching types
 dtype('<U21') dtype('<U21') dtype('<U21')

如何在此处添加创建日期时间索引?

【问题讨论】:

你可以试试不打电话给.values:df.index.get_level_values('month').astype(str) + df.index.get_level_values('year').astype(str) @EdChum 这给了我pandas.indexes.base.InvalidIndexError: Reindexing only valid with uniquely valued Index objects,这就是我尝试这些值的原因。 【参考方案1】:

我认为你可以使用to_datetime,但首先需要多个yearmonth 值:

y = df.index.get_level_values('year')
m = df.index.get_level_values('month')

df['Date'] = pd.to_datetime(y * 10000 + m * 100 + 1, format="%Y%m%d")
print (df)
                              price                 Date
                                foo       bar           
foo          bar year month                             
997182819645 11  2010 1      1.1900  3.000000 2010-01-01
                      2      2.2625  4.001769 2010-02-01

如果需要,请将列附加到index:

df['Date'] = pd.to_datetime(y * 10000 + m * 100 + 1, format="%Y%m%d")
df.set_index('Date', append=True, inplace=True)
print (df)
                                         price          
                                           foo       bar
foo          bar year month Date                        
997182819645 11  2010 1     2010-01-01  1.1900  3.000000
                      2     2010-02-01  2.2625  4.001769

另一种解决方案是创建新的DataFrame,但需要最后一个0.18.1 version:

y = df.index.get_level_values('year')
m = df.index.get_level_values('month')
d = pd.Index(len(df.index) * [1], name='day')
df1 = pd.DataFrame('year':y, 'month':m, 'day':d, index=df.index)

df['Date']  = pd.to_datetime(df1)
print (df)
                              price                 Date
                                foo       bar           
foo          bar year month                             
997182819645 11  2010 1      1.1900  3.000000 2010-01-01
                      2      2.2625  4.001769 2010-02-01

【讨论】:

以上是关于从隐藏在多索引中的年月创建日期时间的主要内容,如果未能解决你的问题,请参考以下文章

如何从多索引中提取总年份行和列以在绘图中创建直方图

Pandas 多索引数据框 - 从多索引中的一个索引中选择最大值

多索引中的标签输出

熊猫列多索引中的缺失值

多索引中的 Pandas 自定义排序行

熊猫数据框检查索引是不是存在于多索引中