根据数据框中的目标日期输入正值和负值

时间:2019-07-11 19:55:19

标签: python python-3.x pandas dataframe

我有一个包含股票数据的df,想在target_date之前和之后输入负整数和正整数(表示天数)-如下所示:

我所拥有的(日期是索引):

<div *ngIf='username'>
<h1>{{username}}</h1>
</div>

下面是我想要的目标日期是1988年12月16日的图示:

  
      
  1. 创建一个名为“天”的列
  2.   
  3. 在目标日期(例如,1988年12月16日)-在“天”列中输入“ 0”
  4.   
  5. 在“日期”列中-在目标日期之前输入-1到-n(日期之前的df长度)
  6.   
  7. 在“天”列中-在目标日期之后输入1到n(日期之后的df长度)
  8.   
date      symbol    open    high    low close   volume
12/9/1988   AAPL    1.4018  1.4107  1.3839  1.3975  11239200
12/12/1988  AAPL    1.4018  1.4107  1.375   1.375   29470000
12/13/1988  AAPL    1.375   1.3839  1.3661  1.3839  30637600
12/14/1988  AAPL    1.375   1.4286  1.375   1.4196  48325200
12/15/1988  AAPL    1.4286  1.4464  1.4018  1.4107  28142800
12/16/1988  AAPL    1.4107  1.4464  1.4018  1.4332  45872400
12/19/1988  AAPL    1.4375  1.4643  1.4286  1.4554  58581600
12/20/1988  AAPL    1.4643  1.4821  1.4511  1.4643  68546800
12/21/1988  AAPL    1.4643  1.5 1.4643  1.4911  60491200
12/22/1988  AAPL    1.4911  1.5 1.4554  1.4643  26507600
12/23/1988  AAPL    1.4643  1.4779  1.4643  1.4689  10239600
12/27/1988  AAPL    1.4643  1.4821  1.4464  1.4464  14996800
12/28/1988  AAPL    1.4464  1.4554  1.4196  1.4375  12885600

我已经考虑采用以下方法(基于SO,但是找不到源):

date       day  symbol  open    high    low close   volume
12/9/1988   -5  AAPL    1.4018  1.4107  1.3839  1.3975  11239200
12/12/1988  -4  AAPL    1.4018  1.4107  1.375   1.375   29470000
12/13/1988  -3  AAPL    1.375   1.3839  1.3661  1.3839  30637600
12/14/1988  -2  AAPL    1.375   1.4286  1.375   1.4196  48325200
12/15/1988  -1  AAPL    1.4286  1.4464  1.4018  1.4107  28142800
12/16/1988  0   AAPL    1.4107  1.4464  1.4018  1.4332  45872400
12/19/1988  1   AAPL    1.4375  1.4643  1.4286  1.4554  58581600
12/20/1988  2   AAPL    1.4643  1.4821  1.4511  1.4643  68546800
12/21/1988  3   AAPL    1.4643  1.5 1.4643  1.4911  60491200
12/22/1988  4   AAPL    1.4911  1.5 1.4554  1.4643  26507600
12/23/1988  5   AAPL    1.4643  1.4779  1.4643  1.4689  10239600
12/27/1988  6   AAPL    1.4643  1.4821  1.4464  1.4464  14996800
12/28/1988  7   AAPL    1.4464  1.4554  1.4196  1.4375  12885600

在目标日期之前的df长度可以与目标日期之后的df长度不同之前,这对我而言并不完全正确。它与目标日期的“天”列中的“ 0”不匹配。

我还尝试了在目标日期之前和之后截断df的问题-但与上述解决方案相同的问题-它与target_date的“天”列中的“ 0”不匹配。

lenDF = (int(len(df) / 2))
df.insert(0, 'day', range(-lenDF, -lenDF + len(df)))

谢谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我认为numpy的busday_count()在这里可以很好地工作。

我更喜欢使用ISO 8601表示法来表示日期。您可以使用熊猫的DatetimeIndex类:

df.index = pd.DatetimeIndex(df.index)

我们可以按以下方式获取所需列的数据:

days = [np.busday_count('1988-12-16', x.date()) for x in df.index]

迭代pd.Timestamp中的每个DatetimeIndex对象,并从工作日的角度计算与目标日期1988-12-16的差值。

然后您可以按以下方式将此数据分配给您的数据框:

df['day'] = days

并对帖子中显示的列进行重新排序:

df.reindex(columns=['day', 'symbol', 'open', 'high', 'low', 'close', 'volume'])

答案 1 :(得分:0)

我有一个可能很棘手的解决方案,但它应该可以完成工作。


from typing import TypeVar, Generic, List

T = TypeVar('T')


class CircularQueue(Generic[T]):

    def __init__(self):
        self._front = 0
        self._rear = 0
        self._array = list()

    def mod(self, x): return (x+1) % (len(self._array)+1)

    @property
    def is_full(self):
        return self.mod(self._rear) == self.mod(self._front) + 1

    def insert(self, element: T):
        if not self.is_full:
            self._rear += 1
            self._array.append(element)


if __name__ == "__main__":
    # I want to Initialize the queue as cQueue = CircularQueue<int>()
    # Something that other compiled languauges offer
    # Is it possible to do so?
    # Or any other method so that I can restrict the type of objects.
    cQueue = CircularQueue()
    cQueue.insert(10)

    # Here I want to raise an error if I insert any other type of Object
    cQueue.insert('A')    


答案 2 :(得分:0)

这是我计算天数的版本。

dataset=pd.DataFrame(test)
dataset.head()

原始数据的输出:

      date     symbol   high
0   12/9/1988   AAPL    1.4018
1   12/12/1988  AAPL    1.4018
2   12/13/1988  AAPL    1.3750
3   12/14/1988  AAPL    1.3750
4   12/15/1988  AAPL    1.4286

from datetime import datetime
dataset=pd.DataFrame(test)
dataset['date']=pd.to_datetime(dataset['date']) 
target_date = datetime.strptime('12/16/1988', "%m/%d/%Y")
dataset['Days']= (dataset['date'] - (target_date)).dt.days
dataset.head()

输出:

       date    symbol    high   Days
0   1988-12-09  AAPL    1.4018  -7
1   1988-12-12  AAPL    1.4018  -4
2   1988-12-13  AAPL    1.3750  -3
3   1988-12-14  AAPL    1.3750  -2
4   1988-12-15  AAPL    1.4286  -1