我有一个带有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