"重新取样"根据频率的时间戳

时间:2018-06-06 18:56:11

标签: python pandas datetime

我有一只大熊猫Timestamp,其日期时间和频率相关联。但是,日期时间似乎与频率无关。例如,

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

2018年6月6日不是星期五。如何从Timestamp获得2018年6月1日(上周五)? (如果Timestamp是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 个答案:

答案 0 :(得分:2)

OR 如果已经是星期五(4),我们可以使用if语句来不移动日期。感谢 @ Ben.T ,我们可以将它与定义的freq-weekday进行比较,从而使其更加通用。

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

答案 1 :(得分:1)

另一种可能性是使用t的weekday方法以及可以从t访问freq.weekday的事实:

t - pd.Timedelta(days = (t.weekday() - t.freq.weekday)%7 )

答案 2 :(得分:0)

>>> 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')]

答案 3 :(得分:0)

经过一番挖掘,看来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