如何使用熊猫解析从时间段到周期性时间序列的数据

时间:2019-02-20 17:28:24

标签: pandas

我目前正在尝试解析从一个数据帧到另一个具有定期timedateindex的数据帧的起始日期和结束日期。 df1是我的输入数据帧,我想将其解析为df2-structure。 实际上,我不需要这些值本身,我只想标记它们出现的时间。

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)

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

1 个答案:

答案 0 :(得分:0)

您可以将所有值都设置为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
.
.
.