【问题标题】:How to select column for a specific time range from pandas dataframe in python3?如何从python3中的熊猫数据框中选择特定时间范围的列?
【发布时间】:2019-10-30 01:58:43
【问题描述】:

这是我的熊猫数据框

                     time    energy
0     2018-01-01 00:15:00    0.0000
1     2018-01-01 00:30:00    0.0000
2     2018-01-01 00:45:00    0.0000
3     2018-01-01 01:00:00    0.0000
4     2018-01-01 01:15:00    0.0000
5     2018-01-01 01:30:00    0.0000
6     2018-01-01 01:45:00    0.0000
7     2018-01-01 02:00:00    0.0000
8     2018-01-01 02:15:00    0.0000
9     2018-01-01 02:30:00    0.0000
10    2018-01-01 02:45:00    0.0000
11    2018-01-01 03:00:00    0.0000
12    2018-01-01 03:15:00    0.0000
13    2018-01-01 03:30:00    0.0000
14    2018-01-01 03:45:00    0.0000
15    2018-01-01 04:00:00    0.0000
16    2018-01-01 04:15:00    0.0000
17    2018-01-01 04:30:00    0.0000
18    2018-01-01 04:45:00    0.0000
19    2018-01-01 05:00:00    0.0000
20    2018-01-01 05:15:00    0.0000
21    2018-01-01 05:30:00    0.9392
22    2018-01-01 05:45:00    2.8788
23    2018-01-01 06:00:00    5.5768
24    2018-01-01 06:15:00    8.6660
25    2018-01-01 06:30:00   15.8648
26    2018-01-01 06:45:00   24.1760
27    2018-01-01 07:00:00   38.5324
28    2018-01-01 07:15:00   49.9292
29    2018-01-01 07:30:00   64.3788

我想使用特定时间范围 01:15:00 - 05:30:00能量列 中选择值并将这些值相加。要从列中选择数据,我需要小时和分钟值。我知道如何分别使用小时和分钟从列中选择数据..

import panadas as pd
from datetime import datetime as dt
energy_data = pd.read_csv("/home/mayukh/Downloads/Northam_january2018/output1.csv", index_col=None)
#Using Hour 
sum = energy_data[((energy_data.time.dt.hour < 1) & (energy_data.time.dt.hour >= 5))]['energy'].sum()
#using Minute
sum = energy_data[((energy_data.time.dt.minute < 15) & (energy_data.time.dt.minute >= 30))]['energy'].sum()

但我不知道如何同时使用小时和分钟来选择数据。请告诉我如何进行。

【问题讨论】:

    标签: python python-3.x pandas python-datetime


    【解决方案1】:

    使用between_timeDatetimeindex 创建的set_index 一起使用:

    #if necessary convert to datetime
    df['time'] = pd.to_datetime(df['time'])
    a = df.set_index('time').between_time('01:15:00','05:30:00')['energy'].sum()
    print (a)
    0.9392
    

    详情

    print (df.set_index('time').between_time('01:15:00','05:30:00'))
                         energy
    time                       
    2018-01-01 01:15:00  0.0000
    2018-01-01 01:30:00  0.0000
    2018-01-01 01:45:00  0.0000
    2018-01-01 02:00:00  0.0000
    2018-01-01 02:15:00  0.0000
    2018-01-01 02:30:00  0.0000
    2018-01-01 02:45:00  0.0000
    2018-01-01 03:00:00  0.0000
    2018-01-01 03:15:00  0.0000
    2018-01-01 03:30:00  0.0000
    2018-01-01 03:45:00  0.0000
    2018-01-01 04:00:00  0.0000
    2018-01-01 04:15:00  0.0000
    2018-01-01 04:30:00  0.0000
    2018-01-01 04:45:00  0.0000
    2018-01-01 05:00:00  0.0000
    2018-01-01 05:15:00  0.0000
    2018-01-01 05:30:00  0.9392
    

    【讨论】:

    • 感谢您的回复。我之前尝试过使用您的示例,但编译后我收到此错误消息SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy energy_data['time'] = pd.to_datetime(energy_data['time'])
    • energy_data['time'] = pd.to_datetime(energy_data['time']) 之前的代码是什么?
    • @Prayuktibid - 我认为如果像here这样的过滤需要复制
    • report_data['energy (kwh)'] = (report_data['actual_generated_energy (kwh)']) off_peak_energy1 = report_data[report_data.time.dt.weekday &gt;= 5]['energy (kwh)'].sum() energy = report_data[report_data.time.dt.weekday &lt; 5]
    • 所以通过添加 copy - energy = report_data[report_data.time.dt.weekday &lt; 5].copy() 来更改最后一行
    【解决方案2】:

    您可以将您的列转换为datetime 并将.loc 访问器与pd.Series.between 一起使用:

    from datetime import datetime
    
    df['time'] = pd.to_datetime(df['time'])
    
    start = datetime.strptime('01:15:00', '%H:%M:%S').time()
    end = datetime.strptime('05:30:00', '%H:%M:%S').time()
    
    result = df.loc[df['A'].dt.time.between(start, end), 'energy'].sum()
    

    【讨论】:

    • 感谢您的回复。我不能使用日期,因为日期对于我的情况是可变的,吃的可能是任何东西。实际上,我想总结 pone 月份 01:15:00 - 05:30:00 之间的所有值,因此,在一个月内,日期可以是任何日期,但时间范围将是固定的天。
    • @Prayuktibid,请参阅更新。这将独立于日期。
    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    相关资源
    最近更新 更多