直接使用带有偏移别名的日期偏移

2024-09-28 03:21:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我确信我只是没有找到正确的短语来回答这个问题,但在Pandas中,可以使用任何DateTime对象,并使用DateOffset对其进行加减,如:

pd.datetime.now() + pd.DateOffset(months=2)

pd.datetime.now() + pd.DateOffset(weeks=4)

pd.datetime.now() + pd.DateOffset(days=2)

等等

但在不同的上下文中,也会使用偏移别名: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases

我的问题是,有没有一种方法可以使用DateOffset并传递偏移量别名来确定偏移量基准

例如:pd.datetime.now() + pd.DateOffset(n=some_int, freq='W')some_int

如果这是不可能的,我应该在哪里挖掘得到这样的效果

(原因是我使用了一个函数Offset Alias,我不想创建一个很长的if…else语句来将freq字符串转换为pd.DateOffset(weeks=n | years=n | months=n | etc.)的不同实例,而是freq字符串在一行代码中指示日期偏移量,并且仍然是动态的,以处理不同的时间频率。)

编辑:添加一个自定义函数来满足我的需要,但最好在timedelta或DateOffset中有一个解决方案,这样该解决方案是上游的,效率更高。例如,我希望利用我正在使用的所有freq参数的业务版本,以便n能够从源代码中获取更自然、更原始的信息

def datedelta(date, n=0, freq='M'):
    from pandas import to_datetime, DateOffset
    
    if n == 0:
        date_sign = 1
    else:
        date_sign = np.abs(n)/n
        
    freq = freq.lower()
    
    if freq == 'y':
        dtOff = DateOffset(years=abs(n))
    elif freq == 'q':
        dtOff = DateOffset(quarters=abs(n))
    elif freq == 'm':
        dtOff = DateOffset(months=abs(n))
    elif freq == 'w':
        dtOff = DateOffset(weeks=abs(n))
    elif freq == 'd':
        dtOff = DateOffset(days=abs(n))
    else:
        raise ValueError("The freq parameter not one of the following: {'Y', 'Q', 'M', 'W', 'D'}")
        
    return to_datetime(date) + date_sign * dtOff

Tags: pandasdatetimedateifabselsenow偏移量
2条回答

我认为^{} function正在做你想做的事

time = pd.datetime.now() + pd.to_timedelta(5, unit='W')

更新
to_timedelta函数不再支持月、季和年。时间偏移有两种类型的对象:

  • 与日历时间相关的日期偏移量:
  • 时间偏移量,即绝对时间(与夏令时天数的差值)

有关documentation about it的更多详细信息。to_timedelta函数无法知道要使用哪个函数

也许这个功能会有帮助

def offset(freq:str, n:int = 0):
    """
    Pandas DateOffset wrapper
    import pandas as pd
    """
    # =============================================================================
    # offsets_df = pd.read_html('https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html')[2]
    # offsets_df.drop(columns = ['Description'], inplace = True)
    # offsets_df.replace('None', np.NaN, inplace = True)
    # offsets_df.dropna(subset = ['Frequency String'], inplace = True)
    # offsets_df['Frequency String'] = offsets_df['Frequency String'].str.replace("\'", '')
    # for x in ['Date Offset', 'Frequency String']:
    #    offsets_df[x] =  offsets_df[x].str.split(' or ')
    # offsets_df['Date Offset'] = offsets_df['Date Offset'].map(lambda x: x[0])
    # offsets_df = explode_rows(offsets_df, 'Frequency String', fill_value = '')
    # offsets_df.drop_duplicates(subset = ['Frequency String'], inplace = True)
    # offsets_d = dict(zip(offsets_df['Frequency String'], offsets_df['Date Offset']))
    # =============================================================================
    offsets_d = {'B': 'BDay',
                 'C': 'CDay',
                 'W': 'Week',
                 'WOM': 'WeekOfMonth',
                 'LWOM': 'LastWeekOfMonth',
                 'M': 'MonthEnd',
                 'MS': 'MonthBegin',
                 'BM': 'BMonthEnd',
                 'BMS': 'BMonthBegin',
                 'CBM': 'CBMonthEnd',
                 'CBMS': 'CBMonthBegin',
                 'SM': 'SemiMonthEnd',
                 'SMS': 'SemiMonthBegin',
                 'Q': 'QuarterEnd',
                 'QS': 'QuarterBegin',
                 'BQ': 'BQuarterEnd',
                 'BQS': 'BQuarterBegin',
                 'REQ': 'FY5253Quarter',
                 'A': 'YearEnd',
                 'AS': 'YearBegin',
                 'BYS': 'YearBegin',
                 'BA': 'BYearEnd',
                 'BAS': 'BYearBegin',
                 'RE': 'FY5253',
                 'BH': 'BusinessHour',
                 'CBH': 'CustomBusinessHour',
                 'D': 'Day',
                 'H': 'Hour',
                 'T': 'Minute',
                 'min': 'Minute',
                 'S': 'Second',
                 'L': 'Milli',
                 'ms': 'Milli',
                 'U': 'Micro',
                 'us': 'Micro',
                 'N': 'Nano'}
    return eval(f'pd.offsets.{offsets_d[freq]}({n})')

相关问题 更多 >

    热门问题