Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.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 使两个数据帧之间的匹配算法更有效_Python_Pandas - Fatal编程技术网

Python 使两个数据帧之间的匹配算法更有效

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

我有两个数据帧

更短的时间范围(每小时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         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