【问题标题】:Fetch start and end datetime while values are zero在值为零时获取开始和结束日期时间
【发布时间】:2021-10-16 10:53:13
【问题描述】:

我想在 data 的值为零时获取开始日期时间和结束日期时间。 数据在 Postgresql 中。 如果我使用 numpy 或 pandas 获得 Postgresql 解决方案或 Python 的完整帮助。 例如

第 1 列将包含日期时间 第 2 列将包含值。

DateTime    Value
06-07-2021 12:00    -521362.8779
06-07-2021 12:15    -57275.52732
06-07-2021 12:30    0
06-07-2021 12:45    0
06-07-2021 13:00    0
06-07-2021 13:15    0
06-07-2021 13:30    0
06-07-2021 13:45    0
06-07-2021 14:00    -57275.52732
06-07-2021 14:15    -377411.4886
06-07-2021 14:30    -377411.4886
06-07-2021 14:45    0
06-07-2021 15:00    0
06-07-2021 15:15    0
06-07-2021 15:30    -889863.5254
06-07-2021 15:45    -1194683.49
06-07-2021 16:00    0
06-07-2021 16:15    0
06-07-2021 16:30    0
06-07-2021 16:45    0
06-07-2021 17:00    -89539.05766
06-07-2021 17:15    -1117269.624
06-07-2021 17:30    -857357.2725

所需的输出应为 第 1 列序列号, 第 2 列开始日期时间, 第 3 列结束日期时间

Serial No   Start DateTime  End DateTime
1   06-07-2021 12:30    06-07-2021 13:45
2   06-07-2021 14:45    06-07-2021 15:15
3   06-07-2021 16:00    06-07-2021 16:45

【问题讨论】:

    标签: python-3.x pandas postgresql numpy


    【解决方案1】:

    假设您的 DateTime 列的类型已经是 datetime 或者您将上面的字符串转换为 dataframe 使用

    df = pd.read_csv(io.StringIO(df_string), sep='\s{2,}',engine='python',parse_dates=['DateTime'])
    

    那么你做

    x = df['Value'].to_numpy()
    mask = np.empty(x.shape[0], 'bool')
    mask[0] = x[0] == 0
    mask[1:] = (x[1:] == 0)  & (x[:-1] != 0)
    
    mask2 = np.empty(x.shape[0], 'bool')
    mask2[-1] = x[0] == 0
    mask2[:-1] = (x[1:] != 0)  & (x[:-1] == 0)
    
    df2 = pd.DataFrame({'Start': df['DateTime'][mask].reset_index(drop=True),
                  'End' :df['DateTime'][mask2].reset_index(drop=True)})
    

    你得到

                    Start                 End
    0 2021-06-07 12:30:00 2021-06-07 13:45:00
    1 2021-06-07 14:45:00 2021-06-07 15:15:00
    2 2021-06-07 16:00:00 2021-06-07 16:45:00
    

    【讨论】:

    • 谢谢您,您的回答完美,我将不得不研究更多关于 numpy 掩码的知识。
    【解决方案2】:

    我只是将当前行与下一个/上一个行值进行比较。如果一个是零而另一个不是,那么它是一个开始或结束。
    您可以使用 shift 方法来移动行。

    df1 = pd.DataFrame()
    df1['Start DateTime'] = (
        df[(df['Value'] == 0) & (df['Value'].shift() != 0)]
        ['DateTime'].reset_index(drop=True) )
    df1['End DateTime'] = (
        df[(df['Value'] == 0) & (df['Value'].shift(-1) != 0)]
        ['DateTime'].reset_index(drop=True))
    
    Start DateTime End DateTime
    0 06-07-2021 12:30 06-07-2021 13:45
    1 06-07-2021 14:45 06-07-2021 15:15
    2 06-07-2021 16:00 06-07-2021 16:45

    【讨论】:

    • 谢谢,您的回答对我也很有效。但是,我必须接受第一人称的回答作为先到者。
    • @BhuvanKumar 没关系!!!
    • 如果值从零开始但不以零结束怎么办?这不是你必须处理的特殊情况吗?
    猜你喜欢
    • 2021-09-06
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    相关资源
    最近更新 更多