Python 使两个数据帧之间的匹配算法更有效
我有两个数据帧 更短的时间范围(每小时4次) 更长的时间框架(1天) 我想用较长时间段数据中的数据标记较短时间段数据,但n-1天,留下n-1天不存在的NaN 比如说, 结合4h和1d的最终合并数据Python 使两个数据帧之间的匹配算法更有效,python,pandas,Python,Pandas,我有两个数据帧 更短的时间范围(每小时4次) 更长的时间框架(1天) 我想用较长时间段数据中的数据标记较短时间段数据,但n-1天,留下n-1天不存在的NaN 比如说, 结合4h和1d的最终合并数据 Time Data_4h Data_1d 1/1/01 00:00 1.1 NaN 1/1/01 06:00 1.2 NaN 1/1/01 12:00 1.3
Time Data_4h Data_1d
1/1/01 00:00 1.1 NaN
1/1/01 06:00 1.2 NaN
1/1/01 12:00 1.3 NaN
1/1/01 18:00 1.1 NaN
2/1/01 00:00 1.1 1.1
2/1/01 06:00 1.2 1.1
2/1/01 12:00 1.3 1.1
2/1/01 18:00 1.1 1.1
3/1/01 00:00 1.1 1.6
3/1/01 06:00 1.2 1.6
3/1/01 12:00 1.3 1.6
3/1/01 18:00 1.1 1.6
所以对于1/1,它试图找到31/12,但找不到,所以它被标记为NaN。对于2/1,它搜索1/1,并用1.1(1/1的值)标记这些实体。对于3/1,它搜索2/1,并用1.6(2/1的值)标记这些实体
需要注意的是,时间框架数据可能有很大的差距。因此,我无法直接访问较大时间范围内的行
最好的方法是什么
目前,我正在遍历较小时间段的所有行,然后使用如下过滤器搜索较大时间段日期:
large_tf_data[(large_tf_data.index <= target_timestamp)][0]
large_tf_data[(large_tf_data.index首先,注意日期
dayfirstme = lambda d: pd.to_datetime(d.Time, dayfirst=True)
df = df.assign(Time=dayfirstme)
df2 = df2.assign(Time=dayfirstme)
然后将df2
转换成有用的东西
d2 = df2.assign(Time=lambda d: d.Time + pd.Timedelta(1, 'D')).set_index('Time').Data_1d
施展魔法
df.join(df.Time.dt.date.map(d2).rename(d2.name))
Time Data_4h Data_1d
0 2001-01-01 00:00:00 1.1 NaN
1 2001-01-01 06:00:00 1.2 NaN
2 2001-01-01 12:00:00 1.3 NaN
3 2001-01-01 18:00:00 1.1 NaN
4 2001-01-02 00:00:00 1.1 1.1
5 2001-01-02 06:00:00 1.2 1.1
6 2001-01-02 12:00:00 1.3 1.1
7 2001-01-02 18:00:00 1.1 1.1
8 2001-01-03 00:00:00 1.1 1.6
9 2001-01-03 06:00:00 1.2 1.6
10 2001-01-03 12:00:00 1.3 1.6
11 2001-01-03 18:00:00 1.1 1.6
我肯定还有其他方法,但我不想再去想这个问题。这些日期是dayfirst还是monthfirst?这是我自己要做的,但我想确认这些日期是否是dayfirst。不过这证实了这一点。
d2 = df2.assign(Time=lambda d: d.Time + pd.Timedelta(1, 'D')).set_index('Time').Data_1d
df.join(df.Time.dt.date.map(d2).rename(d2.name))
Time Data_4h Data_1d
0 2001-01-01 00:00:00 1.1 NaN
1 2001-01-01 06:00:00 1.2 NaN
2 2001-01-01 12:00:00 1.3 NaN
3 2001-01-01 18:00:00 1.1 NaN
4 2001-01-02 00:00:00 1.1 1.1
5 2001-01-02 06:00:00 1.2 1.1
6 2001-01-02 12:00:00 1.3 1.1
7 2001-01-02 18:00:00 1.1 1.1
8 2001-01-03 00:00:00 1.1 1.6
9 2001-01-03 06:00:00 1.2 1.6
10 2001-01-03 12:00:00 1.3 1.6
11 2001-01-03 18:00:00 1.1 1.6