【问题标题】:Pandas Pivot Table aggfunc in HOURS:MINUTES formatPandas Pivot Table aggfunc 采用 HOURS:MINUTES 格式
【发布时间】:2016-10-25 09:40:28
【问题描述】:

List of dictionary in python as HTML Table format

在上面的链接中,数据透视表被创建并且持续时间被求和,但持续时间应该是Hour.minutes格式的总和

注意:持续时间是作为浮点数而不是时间戳获取的

在 Pandas 中是可能的

我尝试的是在获取我转换成这样的数据本身时

str(int(redmine_hours[1])/60+int(redmine_hours[0])) + '.' + str(int(redmine_hours[1]) % 60)

但 aggfunc 将其识别为浮点值并求和。

【问题讨论】:

    标签: python-2.7 datetime pandas dataframe pivot-table


    【解决方案1】:

    IIUC 您需要将列duration to_timedelta 转换为unit=h (hours) 然后pivot_table(我在参数value 中删除[] 以在列中删除Multiindex):

    import pandas as pd
    dict_data = [{'duration': 0.7, 'project_id': 3, 'resource': u'Arya Stark', 'activity': u'Development'},
    {'duration': 0.9, 'project_id': 4, 'resource': u'Ned Stark', 'activity': u'Development'},
    {'duration': 2.88, 'project_id': 7, 'resource': u'Robb Stark', 'activity': u'Development'},
    {'duration': 0.22, 'project_id': 9, 'resource': u'Jon Snow', 'activity': u'Support'},
    {'duration': 0.3, 'project_id': 9, 'resource': u'Jon Snow', 'activity': u'Support'},
    {'duration': 2.15, 'project_id': 3, 'resource': u'Arya Stark', 'activity': u'Practise'},
    {'duration': 3.35, 'project_id': 4, 'resource': u'Sansa Stark', 'activity': u'Development'},
    {'duration': 2.17, 'project_id': 9, 'resource': u'Rickon Stark', 'activity': u'Development'},
    {'duration': 1.03, 'project_id': 4, 'resource': u'Benjan Stark', 'activity': u'Design'},
    {'duration': 1.77, 'project_id': 4, 'resource': u'Bran Stark', 'activity': u'Testing'},
    {'duration': 1.17, 'project_id': 4, 'resource': u'Ned Stark', 'activity': u'Development'},
    {'duration': 0.17, 'project_id': 9, 'resource': u'Jon Snow', 'activity': u'Support'},
    {'duration': 1.77, 'project_id': 3, 'resource': u'catelyn stark', 'activity': u'Development'},
    {'duration': 0.3, 'project_id': 9, 'resource': u'Jon Snow', 'activity': u'Support'},
    {'duration': 0.45, 'project_id': 9, 'resource': u'Jon Snow', 'activity': u'Support'}]
    
    df = pd.DataFrame(dict_data)
    
    df['duration1'] = pd.to_timedelta(df['duration'], unit='h')
    print (df)
           activity  duration  project_id       resource  duration1
    0   Development      0.70           3     Arya Stark   00:42:00
    1   Development      0.90           4      Ned Stark   00:54:00
    2   Development      2.88           7     Robb Stark   02:52:48
    3       Support      0.22           9       Jon Snow   00:13:12
    4       Support      0.30           9       Jon Snow   00:18:00
    5      Practise      2.15           3     Arya Stark   02:09:00
    6   Development      3.35           4    Sansa Stark   03:21:00
    7   Development      2.17           9   Rickon Stark   02:10:12
    8        Design      1.03           4   Benjan Stark   01:01:48
    9       Testing      1.77           4     Bran Stark   01:46:12
    10  Development      1.17           4      Ned Stark   01:10:12
    11      Support      0.17           9       Jon Snow   00:10:12
    12  Development      1.77           3  catelyn stark   01:46:12
    13      Support      0.30           9       Jon Snow   00:18:00
    14      Support      0.45           9       Jon Snow   00:27:00
    
    pvt1 = pd.pivot_table(df, 
                          values='duration1',
                          index=['project_id','resource'], 
                          columns=['activity'], 
                          aggfunc=np.sum,
                          fill_value=0)
    print (pvt1)
    activity                   Design  Development  Practise  Support  Testing  \
    project_id resource                                                          
    3          Arya Stark    00:00:00     00:42:00  02:09:00 00:00:00 00:00:00   
               catelyn stark 00:00:00     01:46:12  00:00:00 00:00:00 00:00:00   
    4          Benjan Stark  01:01:48     00:00:00  00:00:00 00:00:00 00:00:00   
               Bran Stark    00:00:00     00:00:00  00:00:00 00:00:00 01:46:12   
               Ned Stark     00:00:00     02:04:12  00:00:00 00:00:00 00:00:00   
               Sansa Stark   00:00:00     03:21:00  00:00:00 00:00:00 00:00:00   
    7          Robb Stark    00:00:00     02:52:48  00:00:00 00:00:00 00:00:00   
    9          Jon Snow      00:00:00     00:00:00  00:00:00 01:26:24 00:00:00   
               Rickon Stark  00:00:00     02:10:12  00:00:00 00:00:00 00:00:00   
    All                      01:01:48     12:56:24  02:09:00 01:26:24 01:46:12   
    
    activity                      All  
    project_id resource                
    3          Arya Stark    02:51:00  
               catelyn stark 01:46:12  
    4          Benjan Stark  01:01:48  
               Bran Stark    01:46:12  
               Ned Stark     02:04:12  
               Sansa Stark   03:21:00  
    7          Robb Stark    02:52:48  
    9          Jon Snow      01:26:24  
               Rickon Stark  02:10:12  
    All                      19:19:48  
    

    【讨论】:

    • 它是如何工作的?列durationfloat - 这意味着timedelta 以小时为单位?
    • ValueError: ['d' 'u' 'r' 'a' 't' 'i' 'o' 'n' '1'] 未包含在索引中,我们不能取值=' duration1',因为它在 timedelta 中
    • 是的,我也试过了,raise ValueError('%s not contains in the index' % str(key[mask])) ValueError: ['d' 'u' 'r' 'a ''t' 'i' 'o' 'n' '1'] 未包含在索引中
    • 但是duration1在dataframe中是时间戳格式的,但是可以总结一下
    • 不,它不是时间戳,它是timedelta - 因为您是通过pd.to_timedelta(df['duration'], unit='h') 转换的。对我来说,它适用于最新版本的熊猫 - 0.18.1。你的熊猫版本是什么? print pd.versions()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多