【问题标题】:Pandas Datetime: Splitting start and end date into folds of n-monthsPandas Datetime:将开始日期和结束日期拆分为 n 个月的折叠
【发布时间】:2020-03-11 15:08:03
【问题描述】:

假设您有两个 pandas 日期时间:from_date 和 end_date。我需要一个函数将其拆分为n 个月的折叠(比如说n=3)。例如:

import pandas as pd

from_date = pd.to_datetime("2020-02-15")
to_date = pd.to_datetime("2020-05-20")

应该分成2折:

{
"1": {"from_date": 2020-02-15, "to_date": 2020-05-15}, 
"2": {"from_date": 2020-05-16, "to_date": 2020-05-20}
}

每个折叠都需要满足条件: from_date + pd.DateOffset(months=2) >= end_date。所以这与开始和结束日期之间的天数无关。

什么是最 Pythonic 的方式来做到这一点?熊猫有什么东西吗?

【问题讨论】:

    标签: python pandas date datetime


    【解决方案1】:

    我的解决方案:

    import pandas as pd
    
    def check_and_split(from_date, to_date):
        from_date = pd.to_datetime(from_date)
        to_date = pd.to_datetime(to_date)
    
        done = False
        fold = 0
        result = {}
    
        start = from_date
        end = to_date
    
        while not done:
            if start + pd.DateOffset(months=2) > to_date:
                done = True
                end = to_date
            else:
                end = start + pd.DateOffset(months=3)
    
            result[fold] = {"from_date": start, "to_date": end}
    
            if not done:
                start = end + pd.DateOffset(days=1)
                fold += 1
    
        return result
    

    难道没有更 Pythonic 的方式吗?可能是熊猫的东西?

    【讨论】:

    • 我提供了另一种解决方案。请让我知道它可能缺少什么,以便我可以改进答案。干杯!
    【解决方案2】:

    根据您希望使用 2 个日期的方式替换相应的打印语句!

    根据How do I calculate the date six months from the current date using the datetime Python module?,dateutil.relativedelta 可以帮助解决那些有和没有第 31 天的月份!

    import pandas as pd
    from dateutil.relativedelta import relativedelta
    
    from_date = pd.to_datetime("2020-02-15")
    to_date = pd.to_datetime("2020-05-20")
    fold = 0
    result = {}
    
    
    while from_date+relativedelta(months=+3)<to_date:
        curfrom = from_date #retain current 'from_date'
        from_date =from_date+relativedelta(months=+3)
        result[fold] = {"from_date": curfrom, "to_date": from_date}
        fold = fold+1
        from_date = from_date + relativedelta(days=+1) #So that the next 'from_date' starts 1 day after
    result[fold] = {"from_date": curfrom, "to_date": to_date}
    
    print(result)
    

    【讨论】:

    • 据我所知,dateutil.relativedata 产生的结果与pd.DateOffset 相同。我的问题是是否有更 Pythonic 的方式(没有 while 循环)。在这方面,您的解决方案与我的类似,对我来说两者都不是最佳的(而且您的解决方案还有一个额外的导入)
    • 我想不出不使用某种形式的迭代来替代它,因为它是由于您必须执行的输入数据(from_date 和 to_date)的性质某种形式的迭代将from_date 到to_date 之间的日期分隔为n 个月。如果你愿意,你必须填充一个日期列表,那么你就不必使用任何循环,即from_date = ['2020-02-15', '2020-05-15'],然后你可以使用for x in from_date之类的东西,但我认为它不是那么理想!
    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多