2017-06-14 137 views
1

所以我有一个熊猫DATE_RANGE像这样如何删除日期从熊猫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列表方法和函数不起作用。 我到处都在找。我查看了pandas.date_range的文档,但没有发现任何东西

任何帮助将不胜感激。

回答

3

您可能想要使用drop来删除行。

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) 
+0

谢谢。遮蔽效果很好。从来没有想到。你有任何想法为什么matplotlib fill_between将不适用于pandas date_range作为索引。不断给我这个ufunc错误。 – Parousia

1

您可以尝试创建两个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) 
+0

非常好的解决方案@Rakesh。也许如果你想要日期可以使用发生器快一点。 – Parousia

+1

@Parousia,这个__vectorized__解决方案应该比list/comprehention/generator /等更快。 – MaxU

+0

@Parousia,一般来说,在处理大熊猫和DataFrames时,我会避免不惜一切代价编写一个循环。矢量化解决方案效率更高。 –

0

你可以试试:

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

在地方的Date你将不得不把那里的日期存储在列的名称。

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