代码之家  ›  专栏  ›  技术社区  ›  BallpointBen

“重采样”根据其频率的时间戳

  •  2
  • BallpointBen  · 技术社区  · 6 年前

    我有一只熊猫 Timestamp 与日期时间和频率关联。然而,日期时间似乎与频率无关。例如,

    >>> t = pd.Timestamp('2018-6-6', freq='W-FRI')
    >>> t
    Timestamp('2018-06-06 00:00:00')
    

    2018年6月6日不是周五。我怎么能从这里得到2018年6月1日(前一个星期五) 时间戳 ?(如果 时间戳 如果是2018年6月1日,那么它应该会在2018年6月1日返回。)下面的工作似乎太冗长了。

    >>> friday = (pd.date_range(t + pd.Timedelta('1D'), 
                                periods=1, 
                                freq='W-FRI')
                  - 1)[0]
    >>> friday
    Timestamp('2018-06-01 00:00:00', freq='W-FRI')
    
    4 回复  |  直到 6 年前
        1
  •  2
  •   Anton vBR    6 年前

    如果已经是星期五(4日),我们可以使用if语句不移动日期。多亏了 本·T 我们可以将其与定义的频率工作日进行比较,从而使其更通用。

    import pandas as pd
    
    t = pd.Timestamp('2018-6-7', freq='W-FRI')
    friday = t if t.weekday() == t.freq.weekday else t-1
    
    print(friday)
    

    返回:

    2018-06-01 00:00:00
    
        2
  •  1
  •   Ben.T    6 年前

    另一种可能是使用这些方法 weekday 而事实上 freq.weekday 可从T:

    t - pd.Timedelta(days = (t.weekday() - t.freq.weekday)%7 )
    
        3
  •  0
  •   SciPy    6 年前
    >>> friday = [d for d in pd.date_range(end='2018-6-6', periods=7, freq='D') 
          if d.dayofweek == 4]
    >>> print(friday)
    
    [Timestamp('2018-06-01 00:00:00', freq='D')]
    
        4
  •  0
  •   BallpointBen    6 年前

    经过一番调查,似乎 rollback 是最好的方法。(如果我们希望下周五而不是上周五 rollforward )有两种方法可以创建频率为 W-FRI :

    # Method 1
    >>> from pandas.tseries.offsets import Week
    >>> w_fri = Week(weekday=4) # Mon == 0, Tue == 1, ..., Sun = 6
    >>> w_fri
    <Week: weekday=4>
    
    # Method 2
    >>> from pandas.tseries.frequencies import to_offset
    >>> w_fri = to_offset('W-FRI')
    >>> w_fri
    <Week: weekday=4>
    

    然后进行回滚,

    >>> w_fri.rollback(pd.Timestamp('2019-1-17'))  # A Thursday
    Timestamp('2019-01-11 00:00:00')
    >>> w_fri.rollback(pd.Timestamp('2019-1-18'))  # A Friday
    Timestamp('2019-01-18 00:00:00')
    

    更多信息 here