【问题标题】:How do I create a sparse column with a formatted date如何创建带有格式化日期的稀疏列
【发布时间】:2019-06-15 03:18:09
【问题描述】:

我有一个时间序列数据集,索引为日期时间(一年中的每一天几乎有 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)。有没有办法做到这一点?

【问题讨论】:

  • 您收到错误是因为df.index.day == 1 只有 11 个值,而您正尝试将这 11 个值设置为数据帧的 len 值。

标签: python pandas datetime indexing


【解决方案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

【讨论】:

  • 谢谢 - 已经解决了,还需要 df['str_date'] = df['str_date'].str.replace('NaT', '', regex=False) 删除 'NaT'
【解决方案2】:

您可以通过.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2012-11-25
    • 2023-03-23
    • 2021-05-25
    相关资源
    最近更新 更多