合并两个不同的日期时间列以形成一个序列

时间:2019-04-28 10:51:24

标签: python pandas

我有两个数据集,一个具有每周日期时间,另一个具有每小时日期时间。 我的数据集看起来像这样:-

df1
Week_date               w_values
21-04-2019 20:00:00      10
28-04-2019 20:00:00      20
05-05-2019 20:00:00      30

df2
hour_date                 h_values
19-04-2019 08:00:00         a
21-04-2019 07:00:00         b
21-04-2019 20:00:00         c
22-04-2019 06:00:00         d
23-04-2019 05:00:00         e
28-04-2019 19:00:00         f
28-04-2019 20:00:00         g
28-04-2019 21:00:00         h
29-04-2019 20:00:00         i
05-05-2019 20:00:00         j
06-05-2019 23:00:00         k

尝试合并,但未能获得所需的输出

输出数据集应如下所示

week_date               w_values        hour_date                h_values
21-04-2019 20:00:00      10             21-04-2019 20:00:00         c
21-04-2019 20:00:00      10             22-04-2019 06:00:00         d
21-04-2019 20:00:00      10             23-04-2019 05:00:00         e
21-04-2019 20:00:00      10             28-04-2019 19:00:00         f
28-04-2019 20:00:00      20             28-04-2019 20:00:00         g
28-04-2019 20:00:00      20             28-04-2019 21:00:00         h
28-04-2019 20:00:00      20             29-04-2019 20:00:00         i
05-05-2019 20:00:00      30             05-05-2019 20:00:00         j
05-05-2019 20:00:00      30             06-05-2019 23:00:00         k

仅当星期日期等于小时日期时,每周日期才会更改。...否则它将采用上一个星期日期。...

2 个答案:

答案 0 :(得分:3)

使用'merge_asof'函数。来自pandas文档,“此合并类似于左联接,但我们匹配的是最接近的键而不是相等的键。”

df_week['Week_date']=pd.to_datetime(df_week['Week_date'])
df_hour['hour_date']=pd.to_datetime(df_hour['hour_date'])

df_week_sort=df_week.sort_values(by='Week_date')
df_hour_sort=df_hour.sort_values(by='hour_date')

df_week_sort.rename(columns={'Week_date':'Merge_date'},inplace=True)
df_hour_sort.rename(columns={'hour_date':'Merge_date'},inplace=True)

df_merged=pd.merge_asof(df_hour_sort,df_week_sort,on='Merge_date')

确保按日期戳对两个框架进行排序

答案 1 :(得分:1)

应该执行以下操作(假设Week_datehour_date是日期时间)

(df2.merge(df1, how='left', right_on='Week_date', left_on='hour_date')
    .ffill()
    .dropna())

工作方式

确保两个df都已排序

>>> df1 = df1.sort_values('Week_date')
>>> df2 = df2.sort_values('hour_date')

进行合并

>>> df3 = df2.merge(df1, how='left', right_on='Week_date', left_on='hour_date')
>>> df3
             hour_date h_values           Week_date  w_values
0  2019-04-19 08:00:00        a                 NaT       NaN
1  2019-04-21 07:00:00        b                 NaT       NaN
2  2019-04-21 20:00:00        c 2019-04-21 20:00:00      10.0
3  2019-04-22 06:00:00        d                 NaT       NaN
4  2019-04-23 05:00:00        e                 NaT       NaN
5  2019-04-28 19:00:00        f                 NaT       NaN
6  2019-04-28 20:00:00        g 2019-04-28 20:00:00      20.0
7  2019-04-28 21:00:00        h                 NaT       NaN
8  2019-04-29 20:00:00        i                 NaT       NaN
9  2019-05-05 20:00:00        j 2019-05-05 20:00:00      30.0
10 2019-06-05 23:00:00        k                 NaT       NaN

向前填补空白

>>> df3 = df3.ffill()
>>> df3
             hour_date h_values           Week_date  w_values
0  2019-04-19 08:00:00        a                 NaT       NaN
1  2019-04-21 07:00:00        b                 NaT       NaN
2  2019-04-21 20:00:00        c 2019-04-21 20:00:00      10.0
3  2019-04-22 06:00:00        d 2019-04-21 20:00:00      10.0
4  2019-04-23 05:00:00        e 2019-04-21 20:00:00      10.0
5  2019-04-28 19:00:00        f 2019-04-21 20:00:00      10.0
6  2019-04-28 20:00:00        g 2019-04-28 20:00:00      20.0
7  2019-04-28 21:00:00        h 2019-04-28 20:00:00      20.0
8  2019-04-29 20:00:00        i 2019-04-28 20:00:00      20.0
9  2019-05-05 20:00:00        j 2019-05-05 20:00:00      30.0
10 2019-06-05 23:00:00        k 2019-05-05 20:00:00      30.0

删除其余的NaN

>>> df3 = df3.dropna()
>>> df3
             hour_date h_values           Week_date  w_values
2  2019-04-21 20:00:00        c 2019-04-21 20:00:00      10.0
3  2019-04-22 06:00:00        d 2019-04-21 20:00:00      10.0
4  2019-04-23 05:00:00        e 2019-04-21 20:00:00      10.0
5  2019-04-28 19:00:00        f 2019-04-21 20:00:00      10.0
6  2019-04-28 20:00:00        g 2019-04-28 20:00:00      20.0
7  2019-04-28 21:00:00        h 2019-04-28 20:00:00      20.0
8  2019-04-29 20:00:00        i 2019-04-28 20:00:00      20.0
9  2019-05-05 20:00:00        j 2019-05-05 20:00:00      30.0
10 2019-06-05 23:00:00        k 2019-05-05 20:00:00      30.0
相关问题