如何创建带有格式化日期的稀疏列

时间:2019-01-21 17:22:29

标签: python pandas datetime indexing

我有一个时间序列数据集,其索引为日期时间(一年中的每一天几乎都是1行),我希望经常创建一个带有字符串的稀疏序列(用于绘图)。

obs_date    str_date
2018-01-01  Jan 2018
2018-01-02
2018-01-03
2018-01-04
2018-01-05
2018-01-06
...
2018-02-01 Feb 2018
etc

我尝试过

df['str_date'] = df.index.strftime('%b\n%Y')
df.loc[df.index.day != 1, 'str_date'] = ''

,并且可以正确设置月份的第一天,但​​是可以反过来尝试

df['str_date'] = ''
df.loc[df.index.day == 1, 'str_date'] = df.index.strftime('%b %Y')

给出错误: ValueError:无法将输入数组从形状(350)广播到形状(11)。有办法吗?

2 个答案:

答案 0 :(得分:1)

问题是作业的左右两侧大小不同。相反,您可以使用pd.Index.where同时分配和屏蔽:

df['str_date'] = df.index.where(df.index.day == 1)

print(df) 
#              str_date
# obs_date             
# 2018-01-01 2018-01-01
# 2018-01-02        NaT
# 2018-01-03        NaT
# 2018-01-04        NaT
# 2018-01-05        NaT
# 2018-01-06        NaT
# 2018-02-01 2018-02-01

如果需要特定的字符串格式,则可以对结果调用strftime

df['str_date'] = df.index.where(df.index.day == 1).strftime('%b-%Y')

print(df)
#             str_date
# obs_date            
# 2018-01-01  Jan-2018
# 2018-01-02       NaT
# 2018-01-03       NaT
# 2018-01-04       NaT
# 2018-01-05       NaT
# 2018-01-06       NaT
# 2018-02-01  Feb-2018

答案 1 :(得分:0)

您可以使用.loc进行检查,并使用Series进行分配

df.loc[df.index.day==1,'str_date']=pd.Series(df.index.strftime('%b-%Y'),index=df.index)
df
            str_date
obs_date            
2018-01-01  Jan-2018
2018-01-02       NaN
2018-01-03       NaN
2018-01-04       NaN
2018-01-05       NaN
2018-01-06       NaN
2018-02-01  Feb-2018