首页 > 解决方案 > 如何使用 Pandas 将数据从时间段解析为周期性时间序列

问题描述

我目前正在尝试将带有开始和结束日期的数据从一个数据帧解析到具有周期性时间日期索引的第二个数据帧。df1 是我的输入数据框,我想将其解析为 df2 结构。实际上我不需要这些值本身,我只想标记它们发生的时期。

df1

   Start             End               Value1  Value2
1  2018-01-02 15:20  2018-01-02 19:50  x       Nan
2  2018-03-21 05:40  2018-03-22 11:20  a       b
3  ...

df2

                  Value1  Value2
2018-01-02 15:10  False   False
2018-01-02 15:20  True    False
2018-01-02 15:30  True    False
2018-01-02 15:40  True    False
...
2018-01-02 19:50  True    False
2018-01-02 20:00  False   False

我已经得到了 df2 的结构,但我不知道如何转换数据。

date_rng=pd.date_range(start='2018-01-01', end='2018-12-31', freq='10min')
df2=pd.DataFrame(date_rng, columns=['Date'])
df2['datetime'] = pd.to_datetime(df2['Date'])
df2 = df2.set_index('datetime')
df2.drop(['Date'], axis=1, inplace=True)

任何人都可以帮忙吗?非常感谢

标签: pandas

解决方案


您可以使用设置为 False 的所有值初始化 df2,然后遍历两个数据帧并检查 df2 中的时间是否在 df1 中的一个/或多个指定间隔内。

这是一个工作示例:

# | create some dummy data
data = [{'Start': '2018-01-02 15:20', 'End': '2018-01-02 19:50', 'Value1': 'x', 'Value2': np.nan},
        {'Start': '2018-01-01 00:00:00', 'End': '2018-01-01 00:15:00', 'Value1': 'a', 'Value2': np.nan}]

df1 = pd.DataFrame(data)
df1['Start'] = pd.to_datetime(df1['Start'])
df1['End'] = pd.to_datetime(df1['End'])

date_rng=pd.date_range(start='2018-01-01', end='2018-12-31', freq='10min')
df2=pd.DataFrame(date_rng, columns=['Date'])
df2['Date'] = pd.to_datetime(df2['Date'])
df2 = df2.set_index('Date', drop=True)

# | initialize all values with False
df2['Value1'] = False
df2['Value2'] = False

# | iterate through dataframes (also check if values are NaN)
for _, row_1 in df1.iterrows():
    for index_2, row_2 in df2.iterrows():
        if not pd.isnull(row_1['Value1']):
            row_2['Value1'] = row_1['Start'] <= index_2 and row_1['End'] >= index_2
        if not pd.isnull(row_1['Value2']):
            row_2['Value2'] = row_1['Start'] <= index_2 and row_1['End'] >= index_2

输出:

                    Value1  Value2
Date        
2018-01-01 00:00:00 True    False
2018-01-01 00:10:00 True    False
2018-01-01 00:20:00 False   False
2018-01-01 00:30:00 False   False
.
.
.

推荐阅读