熊猫在datetimeIndex的datetime或datetime合并

时间:2018-08-08 20:36:41

标签: python pandas

目前,我有两个表示excel电子表格的数据框。我希望加入日期相等的数据。这是一个一对多的联接,因为一个电子表格具有一个日期,然后我需要添加具有相同日期的多行数据

一个例子:

            A                  B
     date     data       date                 data
0    2015-0-1 ...     0  2015-0-1 to 2015-0-2 ...
1    2015-0-2 ...     1  2015-0-1 to 2015-0-2 ...

在这种情况下,A的两行都将接收B的行0和1,因为它们都在该范围内。

我尝试使用

df3 = pandas.merge(df2, df1, how='right', validate='1:m', left_on='Travel Date/Range', right_on='End')

完成此操作,但收到此错误。

Traceback (most recent call last):
  File "<pyshell#61>", line 1, in <module>
    df3 = pandas.merge(df2, df1, how='right', validate='1:m', left_on='Travel Date/Range', right_on='End')
  File "C:\Users\M199449\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\reshape\merge.py", line 61, in merge
    validate=validate)
  File "C:\Users\M199449\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\reshape\merge.py", line 555, in __init__
    self._maybe_coerce_merge_keys()
  File "C:\Users\M199449\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\reshape\merge.py", line 990, in _maybe_coerce_merge_keys
    raise ValueError(msg)
ValueError: You are trying to merge on object and datetime64[ns] columns. If you wish to proceed you should use pd.concat

我当然可以根据需要添加更多信息

2 个答案:

答案 0 :(得分:12)

这是合并的选项:

假设您有两个数据框:

Term 1~Term 2~Term 3~Term 4~Term 5~Term 6~

现在进行一些清洁工作以获取所需的所有日期,并确保它们为import pandas as pd df1 = pd.DataFrame({'date': ['2015-01-01', '2015-01-02', '2015-01-03'], 'data': ['A', 'B', 'C']}) df2 = pd.DataFrame({'date': ['2015-01-01 to 2015-01-02', '2015-01-01 to 2015-01-02', '2015-01-02 to 2015-01-03'], 'data': ['E', 'F', 'G']})

datetime

现在将所有内容合并在一起。您将获得99x10K的行。

df1['date'] = pd.to_datetime(df1.date)

df2[['start', 'end']] = df2['date'].str.split(' to ', expand=True)
df2['start'] = pd.to_datetime(df2.start)
df2['end'] = pd.to_datetime(df2.end)
# No need for this anymore
df2 = df2.drop(columns='date')

以及属于这些范围之间的日期的子集:

df = df1.assign(dummy=1).merge(df2.assign(dummy=1), on='dummy').drop(columns='dummy')

例如,如果df[(df.date >= df.start) & (df.date <= df.end)] # date data_x data_y start end #0 2015-01-01 A E 2015-01-01 2015-01-02 #1 2015-01-01 A F 2015-01-01 2015-01-02 #3 2015-01-02 B E 2015-01-01 2015-01-02 #4 2015-01-02 B F 2015-01-01 2015-01-02 #5 2015-01-02 B G 2015-01-02 2015-01-03 #8 2015-01-03 C G 2015-01-02 2015-01-03 中的某些日期是单个日期,由于我们正在使用df2,因此第二个日期将得到.str.split。然后只需使用None进行适当设置即可。

.loc

现在其余的保持不变

答案 1 :(得分:3)

让我们使用此numpy method by @piRSquared

df1 = pd.DataFrame({'date': ['2015-01-01', '2015-01-02', '2015-01-03'], 
                    'data': ['A', 'B', 'C']})
df2 = pd.DataFrame({'date': ['2015-01-01 to 2015-01-02', '2015-01-01 to 2015-01-02', '2015-01-02 to 2015-01-03'], 
                    'data': ['E', 'F', 'G']})

df2[['start', 'end']] = df2['date'].str.split(' to ', expand=True)
df2['start'] = pd.to_datetime(df2.start)
df2['end'] = pd.to_datetime(df2.end)
df1['date'] = pd.to_datetime(df1['date'])

a = df1['date'].values
bh = df2['end'].values
bl = df2['start'].values

i, j = np.where((a[:, None] >= bl) & (a[:, None] <= bh))

pd.DataFrame(np.column_stack([df1.values[i], df2.values[j]]),
             columns=df1.columns.append(df2.columns))

输出:

                  date data                      date data                start                  end
0  2015-01-01 00:00:00    A  2015-01-01 to 2015-01-02    E  2015-01-01 00:00:00  2015-01-02 00:00:00
1  2015-01-01 00:00:00    A  2015-01-01 to 2015-01-02    F  2015-01-01 00:00:00  2015-01-02 00:00:00
2  2015-01-02 00:00:00    B  2015-01-01 to 2015-01-02    E  2015-01-01 00:00:00  2015-01-02 00:00:00
3  2015-01-02 00:00:00    B  2015-01-01 to 2015-01-02    F  2015-01-01 00:00:00  2015-01-02 00:00:00
4  2015-01-02 00:00:00    B  2015-01-02 to 2015-01-03    G  2015-01-02 00:00:00  2015-01-03 00:00:00
5  2015-01-03 00:00:00    C  2015-01-02 to 2015-01-03    G  2015-01-02 00:00:00  2015-01-03 00:00:00
相关问题