从隐藏在多索引中的年份和月份创建日期时间
Create Datetime from year and month hidden in multi-index
我有一个数据框,其中年份和月份隐藏在 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')
如何在此处添加创建日期时间索引?
我认为你可以使用 to_datetime
,但首先需要多个 year
和 month
值:
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
我有一个数据框,其中年份和月份隐藏在 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')
如何在此处添加创建日期时间索引?
我认为你可以使用 to_datetime
,但首先需要多个 year
和 month
值:
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