如何用Hypothesis生成带递增datetime索引的Pandas时序DataFrame
解决方法
要生成带严格递增时序索引的DataFrame,不能直接把pd.date_range硬塞到hypothesis的indexes()里,但可以通过hypothesis的策略组合,模拟出pd.date_range的连续递增效果,同时保留随机生成的特性:
代码实现
import datetime import pandas as pd from hypothesis import strategies as st from hypothesis.extra.pandas import columns as cols from hypothesis.extra.pandas import data_frames, index_strategy # 自定义生成连续日期索引的策略 def sequential_date_index(min_size=5, max_size=20): # 随机生成起始日期,预留足够天数给后续周期 start_date = st.dates( min_value=datetime.date(2023, 10, 31), max_value=datetime.date(2024, 5, 31) - datetime.timedelta(days=max_size-1) ) # 随机生成索引长度(在min到max之间) periods = st.integers(min_value=min_size, max_value=max_size) # 结合起始日期和长度,生成连续递增的日期索引 return start_date.flatmap( lambda s: st.just(pd.date_range(start=s, periods=periods.example(), freq="D")) # 这里freq可以改成你需要的,比如"B"代表工作日 ) # 生成目标DataFrame df = data_frames( columns=cols(["sec1", "sec2", "sec3"], elements=st.floats(allow_infinity=False)), index=index_strategy(sequential_date_index()) ).example() print(df)
关键点
- 起始日期的
max_value要减去max_size-1,避免生成的日期序列超出设定的2024-05-31上限 - 用
flatmap把起始日期和周期数的策略结合,输出标准的pd.DatetimeIndex - 可以自由调整
freq参数(比如"B"、"W"等),以及min_size/max_size控制索引长度范围 - 最终生成的索引是严格递增的,完全符合时序数据的要求
内容的提问来源于stack exchange,提问作者Andi
相关产品推荐
相关产品推荐

