【问题标题】:How to delete a date from pandas date_range如何从熊猫 date_range 中删除日期
【发布时间】:2017-06-14 19:21:16
【问题描述】:

所以我有一个像这样的熊猫 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 的文档,但一无所获

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas date-range


    【解决方案1】:

    您可能想使用 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)
    

    【讨论】:

    • 谢谢。掩蔽效果很好。从来没想过。您知道为什么 matplotlib fill_between 不适用于 pandas date_range 作为索引。一直给我这个 ufunc 错误。
    【解决方案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。也许如果一个人只想要日期,使用生成器可能会更快一些。
    • @Parousia,这个 vectorized 解决方案应该比列表理解/生成器/等更快。
    • @Parousia,作为一般规则,在使用 pandas 和 DataFrames 时,我会不惜一切代价避免编写循环。矢量化解决方案效率更高。
    • @RakeshAdhikesavan,感谢您指出这一点。问题是我是 pandas 的新手,并且我正在接受它有一个陡峭的学习曲线的事实。我只知道名义上的矢量化解决方案。如果您知道有关该主题的任何好的教程,请分享链接。谢谢
    【解决方案3】:

    你可以试试:

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

    代替Date,您必须输入存储日期的列的名称。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-14
      • 2023-01-12
      • 1970-01-01
      • 2017-02-09
      • 2018-01-18
      • 2020-07-06
      • 2021-03-19
      • 1970-01-01
      相关资源
      最近更新 更多