如何从pandas的date_range中删除一个日期

4

我有一个如下的pandas date_range:

dates = pd.date_range(start='2005-1-1', end='2014-12-31', freq='D')

我希望能够去掉所有闰年多出来的天数。
我使用 for 循环。
for each in index:
    if each.month==2 and each.day==29:
        print(each) # I actually want to delete this item from dates

但我的问题是我不知道如何删除该项。常规的Python列表方法和函数无法使用。我已经在SO上找了很久,也查看了pandas.date_range的文档,但没有找到任何有用的信息。任何帮助将不胜感激。
3个回答

7

您可能希望使用删除操作来删除行。

import pandas as pd
dates = pd.date_range(start='2005-1-1', end='2014-12-31', freq='D')

leap = []
for each in dates:
    if each.month==2 and each.day ==29:
        leap.append(each)

dates = dates.drop(leap)

谢谢。遮罩效果很好。从未想过。你有任何想法为什么 matplotlib 的 fill_between 在 pandas 的 date_range 作为索引时不起作用,一直给我这个 ufunc 错误。 - chidimo

2
你可以尝试创建两个Series对象,分别存储月份和日期,并将它们用作掩码。
dates = pd.date_range(start='2005-1-1', end='2014-12-31', freq='D') #All dates between range
days = dates.day #Store all the days
months = dates.month #Store all the months

dates = dates[(days != 29) & (months != 2)] #Filter dates using a mask

为确认这种方法是否可行,如果你将!=条件改为==,我们就可以看到你希望排除的日期。

UnwantedDates = dates[(days == 29) & (months == 2)]

输出:

DatetimeIndex(['2008-02-29', '2012-02-29'], dtype='datetime64[ns]', freq=None)

非常好的解决方案@Rakesh。也许如果只想要日期,使用生成器会更快一些。 - chidimo
1
@Parousia,这个__向量化__解决方案应该比列表推导/生成器/等更快。 - MaxU - stand with Ukraine
@Parousia,一般来说,在使用pandas和DataFrames时,我尽量避免编写循环。向量化的解决方案更加高效。 - Rakesh Adhikesavan
@RakeshAdhikesavan,感谢您指出这一点。问题是我对pandas还很陌生,正在逐渐了解它具有陡峭的学习曲线。我只是听说过向量化解决方案。如果您知道任何关于这个主题的好教程,请分享一个链接。谢谢。 - chidimo

1
你可以尝试:

dates = dates[~dates['Date'].str.contains('02-29')] 

Date的位置,您需要放置日期存储的列的名称。

您不必使用for循环,因此运行速度更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接