Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:当索引为年-月,列为日时,将数据帧转换为系列_Python_Pandas - Fatal编程技术网

Python 熊猫:当索引为年-月,列为日时,将数据帧转换为系列

Python 熊猫:当索引为年-月,列为日时,将数据帧转换为系列,python,pandas,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') Y_M 20171001 1 20171002 2 20171003 3 20171004 4 20171101 5 20171

我有一个看起来类似于以下内容的数据帧:

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')
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
这将创建如下所示的数据帧:

        1  2  3   4
Y_M                
201711  1  2  3  4
201712  5  6  7  8
201713  9  10 11 12
这些列是一个月的第几天。他们向右延伸,一直延伸到31岁。(2月份的第29、30和31列将填充NaN)。 该指数包含年份和月份(例如201711指2017年11月)

我的问题是:我怎样才能把它做成一个单一的系列,把年/月/日结合起来?我的输出如下:

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')
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
该索引可以转换为日期时间。事实上,我认为这样做会更容易

用于
系列
,然后将
datetimes
by与
timedelta
by组合使用 :

最后,如有必要,在
索引中添加
字符串
(不是
日期时间索引
)添加:


不带
日期

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

堆栈正是我需要的函数!谢谢你@jezrael!不客气!如果我的答案有用,别忘了-点击复选标记(
),将其从灰显切换为填充。谢谢,哇。这是一个很好的方法!也允许对非日期值执行此操作。不过我不太明白。在
index.map()
中,您向它传递一个字符串,该字符串指示它映射的内容。它访问层次索引“0”,即级别0和1。但我不知道什么是
:>02s
,也不知道为什么这也适用于原始“day”列中的两位数值。
pd.Index.map
接受一个可调用的并将每个索引值传递给它。在本例中,索引是一个多索引。因此,传递给可调用对象的每个值都是一个元组。知道了这一点,我设计了一个字符串格式化可调用函数来处理它。你可以用字符串格式做很多稀奇古怪的事情,我不能在这里全部介绍,但我要说的是,我希望元组
{0[0]}
的第一个元素在前面,元组
{0[1]}
的第二个元素在后面。然而,我给它添加了一些对齐魔法
{0[1]:>02s}
要求将字符串向右对齐,并使用缓冲区2填充
0
。感谢您的详细解释!这太棒了。