如何将pd.date_range生成的日期范围与地点DataFrame做笛卡尔积合并?
解决方案
要实现每个地点与所有生成日期的一一对应,本质是求日期数据集和地点数据集的笛卡尔积(全交叉连接),用Pandas可以通过以下两种方法快速实现:
方法一:使用merge(how='cross')(推荐,Pandas 1.2.0+支持)
这是最直接的方式,Pandas原生支持交叉连接:
import pandas as pd # 1. 生成日期范围并转为DataFrame dates = pd.date_range(start='2022-10-16', end='2022-10-19') dates_df = pd.DataFrame({'Date': dates}) # 2. 处理原地点DataFrame(若有重复地点可先去重) # 示例原DataFrame df = pd.DataFrame({'Location': ['A', 'B', 'C']}) # 若原数据存在重复地点,执行去重:df = df[['Location']].drop_duplicates() # 3. 执行交叉连接 result = pd.merge(dates_df, df, how='cross')
方法二:通过虚拟键实现(兼容低版本Pandas)
如果你的Pandas版本低于1.2.0,可以通过添加临时虚拟键完成连接:
import pandas as pd # 1. 生成日期DataFrame并添加虚拟键 dates = pd.date_range(start='2022-10-16', end='2022-10-19') dates_df = pd.DataFrame({'Date': dates}) dates_df['dummy_key'] = 1 # 2. 处理地点DataFrame并添加相同虚拟键 df = pd.DataFrame({'Location': ['A', 'B', 'C']}) df['dummy_key'] = 1 # 3. 合并后删除虚拟键 result = pd.merge(dates_df, df, on='dummy_key').drop('dummy_key', axis=1)
执行后result即为每个地点对应全部日期的结果表,示例结构如下:
| Date | Location |
|---|---|
| 2022-10-16 | A |
| 2022-10-16 | B |
| 2022-10-16 | C |
| 2022-10-17 | A |
| ... | ... |
内容的提问来源于stack exchange,提问作者Blue Moon
相关产品推荐
相关产品推荐

