Pandas:当index为Year-Month且列为Day时,将DataFrame转换为Series

时间:2017-11-16 06:23:24

标签: python pandas

我有一个类似于以下内容的数据框:

df = pd.DataFrame({'Y_M':['201710','201711','201712'],'1':[1,5,9],'2':[2,6,10],'3':[3,7,11],'4':[4,8,12]})
df = df.set_index('Y_M')

创建一个如下所示的数据框:

        1  2  3   4
Y_M                
201711  1  2  3  4
201712  5  6  7  8
201713  9  10 11 12

列是该月的某一天。它们向右延伸,一直延伸到31(2月将有29,3和31列填充NaN)。 该指数包含年份和月份(例如201711指2017年11月)

我的问题是:如何将这个系列与年/月/日相结合?我的输出如下:

Y_M                
20171001    1
20171002    2
20171003    3
20171004    4
20171101    5  
20171102    6
20171103    7
20171104    8
20171201    9
20171202   10
20171203   11
20171204   12

索引可以转换为日期时间。事实上,我认为这会让事情变得更容易。

2 个答案:

答案 0 :(得分:2)

stack用于Series,然后将datetimesto_datetime合并为timedeltas to_timedelta

df = df.stack()
df.index = pd.to_datetime(df.index.get_level_values(0), format='%Y%m') + \
           pd.to_timedelta(df.index.get_level_values(1).astype(int) - 1, unit='D') 
print (df)
2017-10-01     1
2017-10-02     2
2017-10-03     3
2017-10-04     4
2017-11-01     5
2017-11-02     6
2017-11-03     7
2017-11-04     8
2017-12-01     9
2017-12-02    10
2017-12-03    11
2017-12-04    12
dtype: int64

print (df.index)
DatetimeIndex(['2017-10-01', '2017-10-02', '2017-10-03', '2017-10-04',
               '2017-11-01', '2017-11-02', '2017-11-03', '2017-11-04',
               '2017-12-01', '2017-12-02', '2017-12-03', '2017-12-04'],
              dtype='datetime64[ns]', freq=None)

strings(不是index)中{} {}必要时{}继续添加DatetimeIndex.strftime

DatetimeIndex

答案 1 :(得分:1)

不带date

s = df.stack()
s.index = s.index.map('{0[0]}{0[1]:>02s}'.format)
s

20171001     1
20171002     2
20171003     3
20171004     4
20171101     5
20171102     6
20171103     7
20171104     8
20171201     9
20171202    10
20171203    11
20171204    12
dtype: int64