当月份不是以 01 开头时,如何在日期时间索引中获取每个月的第一天?



我有一个带有DateTimeIndex的数据帧,10年了,一天天。我需要提取对应于每个月第一天的行。但是,并非所有月份都以 01 开头,有些月份以 02、03、04 等开头。

2020-01-02
2020-01-03
...
2020-01-31
2020-02-03
...
2020-02-29
2020-03-02

预期的 df 必须是:

2020-01-02
2020-02-03
2020-03-02

有什么建议吗?

使用DatetimeIndex.to_period几个月,然后按Index.duplicated测试重复项,并在月份的第一天使用反掩码过滤boolean indexing

#if necessary
df = df.sort_index()
print (df)
A
date         
2020-01-02  4
2020-01-03  9
2020-01-31  2
2020-02-03  7
2020-02-29  3
2020-03-02  1
df1 = df[~df.index.to_period('m').duplicated()]
print (df1)
A
date         
2020-01-02  4
2020-02-03  7
2020-03-02  1

详情

print (df.index.to_period('m'))
PeriodIndex(['2020-01', '2020-01', '2020-01', '2020-02', '2020-02', '2020-03'], 
dtype='period[M]', name='date', freq='M')
print (df.index.to_period('m').duplicated())
[False  True  True False  True False]
print (~df.index.to_period('m').duplicated())
[ True False False  True False  True]

另一种解决方案是使用GroupBy.head

df1 = df.groupby(df.index.to_period('m')).head(1)
print (df1)
A
date         
2020-01-02  4
2020-02-03  7
2020-03-02  1

最新更新