«Resample» метка времени в соответствии с его частотой - PullRequest
0 голосов
/ 06 июня 2018

У меня есть панда Timestamp с датой, временем и частотой.Тем не менее, дата и время не зависят от частоты.Например,

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

6 июня 2018 года не пятница.Как я могу получить 1 июня 2018 года (предыдущую пятницу) из этого Timestamp?(Если бы Timestamp было 1 июня 2018 года, то оно должно вернуться 1 июня 2018 года.) Следующие работы, но кажутся слишком многословными.

>>> 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 голосов
/ 18 января 2019

После некоторого копания кажется, что 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')

Подробнее здесь

0 голосов
/ 06 июня 2018

Другая возможность состоит в том, чтобы использовать методы weekday из t и тот факт, что freq.weekday доступен из t:

t - pd.Timedelta(days = (t.weekday() - t.freq.weekday)%7 )
0 голосов
/ 06 июня 2018

ИЛИ мы можем использовать оператор if, чтобы не перемещать дату, если она уже пятница (4).Благодаря @Ben.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
0 голосов
/ 06 июня 2018
>>> 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')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...