Python 创建时间序列数据帧的最快方法

Python 创建时间序列数据帧的最快方法,python,pandas,dataframe,time,series,Python,Pandas,Dataframe,Time,Series,我想获取包含时间间隔和时间重复的数据,基本上使用任何给定时间的第一次出现并向前填充来创建时间序列。考虑下面的例子。 假设这是我们感兴趣的时间范围: 时间 1:00 1:01 1:02 1:03 1:04 1:05 merge\u asof 请参见下面的解决方案,以查看最终解决方案 首先,我们需要将这些列更改为pd.Timedelta: df1['Time'] = pd.to_timedelta(df1['Time'] + ':00') df2['Occurance'] = pd.to_timed

我想获取包含时间间隔和时间重复的数据,基本上使用任何给定时间的第一次出现并向前填充来创建时间序列。考虑下面的例子。

假设这是我们感兴趣的时间范围:

时间 1:00 1:01 1:02 1:03 1:04 1:05
merge\u asof
请参见下面的解决方案,以查看最终解决方案

首先,我们需要将这些列更改为
pd.Timedelta

df1['Time'] = pd.to_timedelta(df1['Time'] + ':00')
df2['Occurance'] = pd.to_timedelta(df2['Occurance'] + ':00')
然后我们可以合并

pd.merge_asof(df1, df2, left_on='Time', right_on='Occurance')

             Time       Occurance Value
0 0 days 01:00:00 0 days 01:00:00     R
1 0 days 01:01:00 0 days 01:00:00     R
2 0 days 01:02:00 0 days 01:00:00     R
3 0 days 01:03:00 0 days 01:03:00     T
4 0 days 01:04:00 0 days 01:03:00     T
5 0 days 01:05:00 0 days 01:05:00     S
这有两个问题:

  • 有比指定的OP更多的列
  • 我有
    T
    s而不是
    G
    s
  • 好的,为了去掉这些列,我们只需重命名其中一列,而不是使用
    left\u on
    /
    right\u on

    pd.merge_asof(df1.set_axis(['Occurance'], axis=1), df2)
    
            Occurance Value
    0 0 days 01:00:00     R
    1 0 days 01:01:00     R
    2 0 days 01:02:00     R
    3 0 days 01:03:00     T
    4 0 days 01:04:00     T
    5 0 days 01:05:00     S
    
    但是我们仍然有
    T
    s而不是
    G
    s,这是因为看看
    df2

            Occurance Value
    0 0 days 01:00:00     R
    1 0 days 01:03:00     G  # same Occurance
    2 0 days 01:03:00     L  # same Occurance
    3 0 days 01:03:00     P  # same Occurance
    4 0 days 01:03:00     T  # same Occurance
    5 0 days 01:05:00     S
    
    很明显,熊猫们选择了最后一只,而OP想要第一只。因此,让我们再次尝试使用
    删除重复项

    解决方案
    不确定,但我想到了pandas.merge\u asof。这里有一些简单化的例子:就好像“a”列是timestamp/date类型一样。另见
    pd.merge_asof(df1.set_axis(['Occurance'], axis=1),
                  df2.drop_duplicates('Occurance'))
    
            Occurance Value
    0 0 days 01:00:00     R
    1 0 days 01:01:00     R
    2 0 days 01:02:00     R
    3 0 days 01:03:00     G
    4 0 days 01:04:00     G
    5 0 days 01:05:00     S