【问题标题】:Pandas Filtering and Tagging Data in Given Date RangePandas 在给定日期范围内过滤和标记数据
【发布时间】:2020-01-11 11:52:35
【问题描述】:

我有两个数据框。

pd.DataFrame({'date': {10: Timestamp('2019-01-01 10:00:00'), 52: Timestamp('2019-01-03 04:00:00'), 54: Timestamp('2019-01-03 06:00:00'), 72: Timestamp('2019-01-04 00:00:00'), 74: Timestamp('2019-01-04 02:00:00')}, 'value_1': {10: 4380.0, 52: 4440.0, 54: 4630.0, 72: 4540.0, 74: 4460.0}, 'value_2': {10: 5, 52: 5, 54: 1, 72: 5, 74: 1}})

DF1

                  date  value_1  value_2
10 2019-01-01 10:00:00   4380.0        5
52 2019-01-03 04:00:00   4440.0        5
54 2019-01-03 06:00:00   4630.0        1
72 2019-01-04 00:00:00   4540.0        5
74 2019-01-04 02:00:00   4460.0        1

DF2 包含与 DF1 相同的日期列,从 2019-01-01 00:00:00 开始,到 2019-12-31 00:00:00 结束,以及其他不常见的列。

如果 DF1 和 DF2 中的日期与以下代码匹配,我已将 DF1 中的 values_1 值放入 DF2:

DF2['value_1'] = DF2['date'].map(DF1.set_index('date')['value_1'])

现在我正在尝试将匹配日期的最后 30 分钟的相同值放入 DF2。换句话说,如果匹配的日期和时间让我们说2019-01-01 10:00:00 并且value_1 是4380.0。那么对于 DF2 中从 2019-01-01 09:30:002019-01-01 10:00:00 的日期,value_1 列应该是 4380.0

我该怎么做?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我认为您需要 merge_asof 和默认 direction='backward' 然后 direction='forward' 并通过 DataFrame.combine_first 组合两个 DataFrame:

    DF1 = pd.DataFrame({'date': {10: pd.Timestamp('2019-01-01 10:00:00'), 52: pd.Timestamp('2019-01-03 04:00:00'), 54: pd.Timestamp('2019-01-03 06:00:00'), 72: pd.Timestamp('2019-01-04 00:00:00'), 74: pd.Timestamp('2019-01-04 02:00:00')}, 'value_1': {10: 4380.0, 52: 4440.0, 54: 4630.0, 72: 4540.0, 74: 4460.0}, 'value_2': {10: 5, 52: 5, 54: 1, 72: 5, 74: 1}})
    
    #small data for test    
    DF2 = pd.DataFrame({'date':pd.date_range('2019-01-01 08:00:00', 
                                             '2019-01-01 12:00:00', freq='20Min')})
    print (DF2)
                      date
    0  2019-01-01 08:00:00
    1  2019-01-01 08:20:00
    2  2019-01-01 08:40:00
    3  2019-01-01 09:00:00
    4  2019-01-01 09:20:00
    5  2019-01-01 09:40:00
    6  2019-01-01 10:00:00
    7  2019-01-01 10:20:00
    8  2019-01-01 10:40:00
    9  2019-01-01 11:00:00
    10 2019-01-01 11:20:00
    11 2019-01-01 11:40:00
    12 2019-01-01 12:00:00
    

    df1 = pd.merge_asof(DF2, DF1, on='date', tolerance=pd.Timedelta('30Min'))
    df2 = pd.merge_asof(DF2, DF1, on='date', tolerance=pd.Timedelta('30Min'), direction='forward')
    
    df = df1.combine_first(df2)
    print (df)
                      date  value_1  value_2
    0  2019-01-01 08:00:00      NaN      NaN
    1  2019-01-01 08:20:00      NaN      NaN
    2  2019-01-01 08:40:00      NaN      NaN
    3  2019-01-01 09:00:00      NaN      NaN
    4  2019-01-01 09:20:00      NaN      NaN
    5  2019-01-01 09:40:00   4380.0      5.0
    6  2019-01-01 10:00:00   4380.0      5.0
    7  2019-01-01 10:20:00   4380.0      5.0
    8  2019-01-01 10:40:00      NaN      NaN
    9  2019-01-01 11:00:00      NaN      NaN
    10 2019-01-01 11:20:00      NaN      NaN
    11 2019-01-01 11:40:00      NaN      NaN
    12 2019-01-01 12:00:00      NaN      NaN
    

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2021-10-16
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多