将日期范围转换为整数序列

convert range of dates into sequence of integers

我有几个不同日期的财务信息的数据框,看起来像这样。

    symbol  split_date  date_start  date_end    marketCap   Date        Adj Close        Volume
0   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-02-28  6.300000190734862 22010.0
1   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-03-02  6.0999999046325675   7300.0
2   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-03-03  6.5 9700.0
3   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-03-04  7.0 13340.0
4   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-03-05  6.9000000953674325  5510.0
5   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-03-06  6.4000000953674325  5790.0
6   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-03-09  6.300000190734862   10080.0
7   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-03-10  6.0 14630.0
8   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-03-11  5.300000190734863   20160.0
9   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-03-12  4.699999809265137   17390.0

在这个数据框中,我有 577 个不同的符号(不仅仅是 USAU)。 Date 列中的所有日期都是不同的范围,因为它们都以发生的特定事件为中心。

我正在尝试创建一个列,该列为数据集中具有唯一日期范围的每个代码分配一个整数 (1-10) 到分组日期。

伪代码:

for symbol in symbols_in_dataframe:
    convert date of symbol to integer

# IE
# Symbol: A YYYY/MM/01 -> 1
# Symbol: A YYYY/MM/02 -> 2
# .....
# Symbol: A YYYY/MM/10 -> 10
    This loops through each symbol.

# Symbol: B YYYY/MM/01 -> 1
# Symbol: B YYYY/MM/02 -> 2
# .....
# Symbol: B YYYY/MM/10 -> 10

我试了一下,但这不是我想要的结果。

def to_integer(dt_time):
    return 10000*dt_time.year + 100*dt_time.month + dt_time.day

blank_df = pd.dataframe()
for symbol in symbols_in_dataframe:
    blank_df.map(symbol, to_integer)

如有任何帮助,我们将不胜感激。


编辑:

数据帧的预期输出:

    symbol  split_date  date_start  date_end    marketCap   Date    Adj Close   Volume   Num_seq
0   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-02-28  6.3     22010.0    1
1   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-03-02  6.1     7300.0     2
2   USAU    2020-03-20  2020-02-28  2020-05-01  45773136    2020-03-03  6.5     9700.0     3
44  INLX    2020-03-20  2020-02-28  2020-05-01  19112184    2020-02-21  4.50    0.0        1
45  INLX    2020-03-20  2020-02-28  2020-05-01  19112184    2020-02-24  4.00    600.0      2
46  INLX    2020-03-20  2020-02-28  2020-05-01  19112184    2020-02-25  4.00     20.0      3
95  OMWS    2020-03-19  2020-02-27  2020-04-30  92829984    2021-04-12  0.25    1000.0     1
96  OMWS    2020-03-19  2020-02-27  2020-04-30  92829984    2021-04-14  0.25    6502.0     2
97  OMWS    2020-03-19  2020-02-27  2020-04-30  92829984    2021-04-16  0.25    0.0        3

本质上,对于 symbol 的每个实例,我试图为数据帧中的每个符号分配一个计数,这里在 Num_seq 下可以看到序列中的数字,如果这有意义的话。

你应该可以使用上面的数据框作为参考。


使用评论中的代码示例进行编辑:

它似乎正在以交替格式对数据帧上的每个其他索引条目进行复制和排序。不过,我不完全确定代码正在编辑什么,因为 split_datedate_startdate_end 不应更改。

    symbol  split_date  date_start  date_end    marketCap   Date    Adj Close   Volume  seq
44  INLX    2020-03-20  2020-02-28  2020-05-01  19112184    2020-02-21  4.500000    0.0     1
68  INLX    2020-03-13  2020-02-21  2020-04-24  19112184    2020-02-21  4.500000    0.0     1
45  INLX    2020-03-20  2020-02-28  2020-05-01  19112184    2020-02-24  4.000000    600.0   2
69  INLX    2020-03-13  2020-02-21  2020-04-24  19112184    2020-02-24  4.000000    600.0   2
46  INLX    2020-03-20  2020-02-28  2020-05-01  19112184    2020-02-25  4.000000    20.0    3
70  INLX    2020-03-13  2020-02-21  2020-04-24  19112184    2020-02-25  4.000000    20.0    3
47  INLX    2020-03-20  2020-02-28  2020-05-01  19112184    2020-02-26  4.000000    0.0     4
71  INLX    2020-03-13  2020-02-21  2020-04-24  19112184    2020-02-26  4.000000    0.0     4

这是使用 groupbycumsum 为每个唯一符号中的每个唯一日期分配递增数字的一种方法。不确定这是否正是您想要的,如果我理解有误,请评论

这是一个与您发布的数据集相似的示例

df = pd.DataFrame({
    'symbol':['a','a','a','b','b','b','c','c'],
    'values':[8,9,9,9,10,11,12,13]
})

df = df.sort_values(['symbol','values']) #if table is not already sorted. for you it would be ['symbol','Date']

df['x'] = (
    df.groupby('symbol')['values'] #group by symbol
      .transform(lambda v: (~v.duplicated()).cumsum()) #assign numbers, avoiding duplicate counting
)
print(df)

输出:

  symbol  values  x
0      a       8  1
1      a       9  2
2      a       9  2
3      b       9  1
4      b      10  2
5      b      11  3
6      c      12  1
7      c      13  2