Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在两个索引(datetime和date)上使用部分公共元素合并两个不相等的数据帧_Python_Pandas_Datetime_Merge - Fatal编程技术网

Python 在两个索引(datetime和date)上使用部分公共元素合并两个不相等的数据帧

Python 在两个索引(datetime和date)上使用部分公共元素合并两个不相等的数据帧,python,pandas,datetime,merge,Python,Pandas,Datetime,Merge,我想在两列上合并两个不同长度的数据帧,这两列有一个公共元素 左侧数据框(A)的索引为datetime类型,同一日期将成倍显示,但时间不同(因此,index.date没有帮助) 右侧数据框(B)的索引为datetime.date类型,每个日期都是不同的,如预期的那样 A=pd.DataFrame({'datetime':['2019-06-01 18:11:55', '2019-06-01 21:43:02','2019-07-23 09:07:18', '2019-07-24 10:32:24'

我想在两列上合并两个不同长度的数据帧,这两列有一个公共元素

左侧数据框(A)的索引为
datetime
类型,同一日期将成倍显示,但时间不同(因此,
index.date
没有帮助)

右侧数据框(B)的索引为
datetime.date
类型,每个日期都是不同的,如预期的那样

A=pd.DataFrame({'datetime':['2019-06-01 18:11:55', '2019-06-01 21:43:02','2019-07-23 09:07:18', '2019-07-24 10:32:24'], \
                'value 1':[2, 5, 80, 0]})

B=pd.DataFrame({'date':['2019-06-01', '2019-07-23', '2019-07-24'], \
                'value 2':[10, 7, 3]})
我需要合并日期上的两个数据框,特别是将B元素放在第一个新日期出现的行中,并用
0
在不同时间填充剩余的相同日期,因此输出应该是这样的(以及注释):

您的输入非常受欢迎使用:

#convert columns to dates
B['date'] = pd.to_datetime(B['date']).dt.date
#convert to columns datetimes
A['datetime'] = pd.to_datetime(A['datetime'])
创建新列-
date
s from
datetime
s in
A
by,用于按
B['date']
进行匹配;
date
s,用于按重复的
日期进行合并:

然后与两列一起使用并左连接,删除辅助列并通过以下方式将添加列的缺失值转换为
0


非常感谢@jezrael提供了非常清晰和简短的代码。工作得很好!
#convert columns to dates
B['date'] = pd.to_datetime(B['date']).dt.date
#convert to columns datetimes
A['datetime'] = pd.to_datetime(A['datetime'])
A['date'] = A['datetime'].dt.date
A['g'] = A.groupby('date').cumcount()
B['g'] = B.groupby('date').cumcount()

#print (A)
#print (B)
df = A.merge(B, on=['date','g'], how='left').drop(['date','g'], axis=1)
df['value 2'] = df['value 2'].fillna(0, downcast='int')
print (df)
             datetime  value 1  value 2
0 2019-06-01 18:11:55        2       10
1 2019-06-01 21:43:02        5        0
2 2019-07-23 09:07:18       80        7
3 2019-07-24 10:32:24        0        3