簡體   English   中英

Pandas Groupby的兩列日期之間的工作日

[英]Business days between two columns of dates with Pandas Groupby

我在Pandas有一個數據Dataframe ,其中有一個字母和兩個日期作為列。 我想使用shift(1)計算上一行的兩個日期列之間的差異,前提是Letter值相同(使用groupby )。 復雜的部分是我想計算工作日,而不僅僅是經過的天數。 我發現做到這一點的最佳方法是使用numpy.busday_count ,它以兩個列表作為參數。 我本質上是試圖使用.apply使每一行成為自己的列表。 不確定這是否是最好的方法,但是會遇到一些模棱兩可的問題。

import pandas as pd
from datetime import datetime
import numpy as np

# create dataframe
df = pd.DataFrame(data=[['A', datetime(2016,01,07), datetime(2016,01,09)],
                        ['A', datetime(2016,03,01), datetime(2016,03,8)],
                        ['B', datetime(2016,05,01), datetime(2016,05,10)],
                        ['B', datetime(2016,06,05), datetime(2016,06,07)]],
                   columns=['Letter', 'First Day', 'Last Day'])

# convert to dates since pandas reads them in as time series
df['First Day'] = df['First Day'].apply(lambda x: x.to_datetime().date())
df['Last Day'] = df['Last Day'].apply(lambda x: x.to_datetime().date())

df['Gap'] = (df.groupby('Letter')
                         .apply(
                                lambda x: (
                                            np.busday_count(x['First Day'].shift(1).tolist(),
                                                            x['Last Day'].shift(1).tolist())))
                         .reset_index(drop=True))
print df

我在lambda函數上收到以下錯誤。 我不確定哪個對象有問題,因為兩個傳遞的參數應該是日期:

ValueError: Could not convert object to NumPy datetime

所需輸出:

  Letter   First Day    Last Day   Gap
0      A  2016-01-07  2016-01-09  NAN
1      A  2016-03-01  2016-03-08  1
2      B  2016-05-01  2016-05-10  NAN
3      B  2016-06-05  2016-06-07  7

以下應該起作用-首先從日期數字中刪除前導零):

df = pd.DataFrame(data=[['A', datetime(2016, 1, 7), datetime(2016, 1, 9)],
                        ['A', datetime(2016, 3, 1), datetime(2016, 3, 8)],
                        ['B', datetime(2016, 5, 1), datetime(2016, 5, 10)],
                        ['B', datetime(2016, 6, 5), datetime(2016, 6, 7)]],
                  columns=['Letter', 'First Day', 'Last Day'])

df['Gap'] = df.groupby('Letter')
              .apply(
               lambda x: 
                   pd.DataFrame(
                       np.busday_count(x['First Day'].tolist(), x['Last Day'].tolist())).shift())
                  .reset_index(drop=True)

  Letter  First Day   Last Day  Gap
0      A 2016-01-07 2016-01-09  NaN
1      A 2016-03-01 2016-03-08  2.0
2      B 2016-05-01 2016-05-10  NaN
3      B 2016-06-05 2016-06-07  6.0

我認為您不需要.date()轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM