use*_*827 11 python dataframe pandas
我有这个人.数据帧:
datetime
2012-01-01 125.5010
2012-01-02 125.5010
2012-01-03 125.5010
2012-02-04 125.5010
2012-02-05 125.5010
2012-02-29 125.5010
2012-02-28 125.5010
2016-01-07 125.5010
2016-01-08 125.5010
2016-02-29 81.6237
Run Code Online (Sandbox Code Playgroud)
我想删除对应于2月29日的所有行,导致foll.数据框:
datetime
2012-01-01 125.5010
2012-01-02 125.5010
2012-01-03 125.5010
2012-02-04 125.5010
2012-02-05 125.5010
2012-02-28 125.5010
2016-01-07 125.5010
2016-01-08 125.5010
Run Code Online (Sandbox Code Playgroud)
现在,我只是手动完成:
df.drop(df.index[['2012-02-29']]).我怎样才能使它适用于所有年份,而不必手动指定行索引.
Fab*_*nna 14
如果您的数据框已经将datetime列作为索引,您可以:
df = df[~((df.index.month == 2) & (df.index.day == 29))]
Run Code Online (Sandbox Code Playgroud)
这应该删除所有年份包含2月29日那天的行.
IIUC你可以掩饰它并删除loc:
def is_leap_and_29Feb(s):
return (s.index.year % 4 == 0) &
((s.index.year % 100 != 0) | (s.index.year % 400 == 0)) &
(s.index.month == 2) & (s.index.day == 29)
mask = is_leap_and_29Feb(df)
print mask
#[False False False False False True False False False True]
print df.loc[~mask]
# datetime
#2012-01-01 125.501
#2012-01-02 125.501
#2012-01-03 125.501
#2012-02-04 125.501
#2012-02-05 125.501
#2012-02-28 125.501
#2016-01-07 125.501
#2016-01-08 125.501
Run Code Online (Sandbox Code Playgroud)
您可以查看日期string,看看它是否以02-29:
df = df[~df.index.str.endswith('02-29')]
Run Code Online (Sandbox Code Playgroud)
使用此方法,您可以使用任何字符串比较方法,如contains,等.