我有一个时间序列数据集,其索引为日期时间(一年中的每一天几乎都是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)。有办法吗?
答案 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