如何在PySpark中合并日期组合与城市对两个DataFrame?
解决方案
你需要实现的是两个DataFrame的笛卡尔积(全连接),让每个日期组合与所有城市对进行匹配,再处理日期格式即可得到目标结果。以下是两种可行方法:
方法一:通过临时键实现全连接(兼容所有Pandas版本)
先给两个DataFrame添加一个相同的临时列,再用merge完成全连接,最后清理临时列并处理日期:
import pandas as pd # 模拟输入数据 df_date_combinations = pd.DataFrame({ 'fs_date': ['2022-06-01T00:00:00', '2022-06-01T00:00:00', '2022-06-01T00:00:00'], 'ss_date': ['2022-06-02T00:00:00', '2022-06-03T00:00:00', '2022-06-04T00:00:00'] }) df_city_pairs = pd.DataFrame({ 'fs_origin': ['TLV', 'TLV', 'TLV'], 'fs_destination': ['NYC', 'ROM', 'BER'], 'ss_origin': ['NYC', 'ROM', 'BER'], 'ss_destination': ['TLV', 'TLV', 'TLV'] }) # 添加临时键 df_date_combinations['temp_key'] = 1 df_city_pairs['temp_key'] = 1 # 全连接并删除临时键 merged_df = pd.merge(df_date_combinations, df_city_pairs, on='temp_key').drop('temp_key', axis=1) # 格式化日期,去除时间部分 merged_df['fs_date'] = pd.to_datetime(merged_df['fs_date']).dt.strftime('%Y-%m-%d') merged_df['ss_date'] = pd.to_datetime(merged_df['ss_date']).dt.strftime('%Y-%m-%d') # 输出结果 print(merged_df.to_string(index=False))
方法二:使用Pandas内置的cross_join(Pandas 1.2.0+)
Pandas 1.2.0及以上版本支持直接用merge(how='cross')生成笛卡尔积,代码更简洁:
import pandas as pd # 模拟输入数据(同上,可复用) df_date_combinations = pd.DataFrame({ 'fs_date': ['2022-06-01T00:00:00', '2022-06-01T00:00:00', '2022-06-01T00:00:00'], 'ss_date': ['2022-06-02T00:00:00', '2022-06-03T00:00:00', '2022-06-04T00:00:00'] }) df_city_pairs = pd.DataFrame({ 'fs_origin': ['TLV', 'TLV', 'TLV'], 'fs_destination': ['NYC', 'ROM', 'BER'], 'ss_origin': ['NYC', 'ROM', 'BER'], 'ss_destination': ['TLV', 'TLV', 'TLV'] }) # 直接生成笛卡尔积 merged_df = df_date_combinations.merge(df_city_pairs, how='cross') # 格式化日期 merged_df['fs_date'] = pd.to_datetime(merged_df['fs_date']).dt.date merged_df['ss_date'] = pd.to_datetime(merged_df['ss_date']).dt.date # 输出结果 print(merged_df.to_string(index=False))
两种方法最终都会生成你需要的DataFrame结构,日期格式也会匹配目标输出。
内容的提问来源于stack exchange,提问作者Daniel Avigdor
相关产品推荐
相关产品推荐

