如何将以下2D表格(由pd.read_excel获取)更改为带有日期时间索引的pandas DataFrame?换句话说,
来自(data_xlsx):获取者:data_xlsx = pd.read_excel('...')
收件人:
1948-01-01 3.4
1948-02-01 3.8
1948-03-01 4.0
。 。 。
1952-11-01 2.8
1952-12-01 2.7
答案 0 :(得分:0)
您可以使用:
df = df.melt('Year', value_name='val')
df.index = pd.to_datetime(df['Year'].astype(str) + df['variable'], format='%Y%b')
df = df.sort_index()[['val']]
<强>解释强>:
melt
to_datetime
创建DatetimeIndex
,然后选中http://strftime.org/。sort_index
并且仅选择val
列替代解决方案:
df = df.set_index('Year').stack()
df.index = (pd.to_datetime(df.index.get_level_values(0).astype(str) +
df.index.get_level_values(1), format='%Y%b'))
df = df.to_frame('val')
<强>解释强>:
set_index
Year
列创建索引
stack
重塑MultiIndex
to_datetime
创建DatetimeIndex
,然后按get_level_values
Series.to_frame
DataFrame
醇>
<强>示例强>:
np.random.seed(1213)
c = ['Jan', 'Feb', 'Mar', 'Apr','May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
df = pd.DataFrame(np.random.randint(10, size=(5,12)), columns=c)
df.insert(0, 'Year', np.arange(1948, 1953))
print (df)
Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
0 1948 0 5 4 8 0 4 6 3 3 0 1 7
1 1949 9 5 2 9 3 1 7 6 3 8 9 2
2 1950 9 5 2 1 6 8 7 7 6 6 5 7
3 1951 1 9 9 3 1 4 0 1 5 1 1 4
4 1952 3 7 1 1 7 3 7 6 8 8 6 1
df = df.set_index('Year').stack()
df.index = (pd.to_datetime(df.index.get_level_values(0).astype(str) +
df.index.get_level_values(1), format='%Y%b'))
df = df.to_frame('val')
print (df.head(10))
val
1948-01-01 0
1948-02-01 5
1948-03-01 4
1948-04-01 8
1948-05-01 0
1948-06-01 4
1948-07-01 6
1948-08-01 3
1948-09-01 3
1948-10-01 0