我有一只大熊猫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')
答案 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