将日期范围转换为整数序列
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_date
、date_start
和 date_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
这是使用 groupby
和 cumsum
为每个唯一符号中的每个唯一日期分配递增数字的一种方法。不确定这是否正是您想要的,如果我理解有误,请评论
这是一个与您发布的数据集相似的示例
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
我有几个不同日期的财务信息的数据框,看起来像这样。
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_date
、date_start
和 date_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
这是使用 groupby
和 cumsum
为每个唯一符号中的每个唯一日期分配递增数字的一种方法。不确定这是否正是您想要的,如果我理解有误,请评论
这是一个与您发布的数据集相似的示例
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