Jaki jest odpowiednik cięcia / qcut dla pól daty pand?

Aktualizacja: począwszy od wersji 0.20.0, wycinanie pandas / qcut DOKŁADNIE obsługuje pola daty. WidziećCo nowego po więcej.

pd.cut i pd.qcut obsługują teraz typy danych datetime64 i timedelta64 (GH14714, GH14798)

Oryginalne pytanie: Funkcje wycinania pand i qcut świetnie nadają się do „ciągnięcia” ciągłych danych do wykorzystania w tabelach przestawnych itd., Ale nie widzę łatwego sposobu na uzyskanie osi czasu w miksie. Frustrujące, ponieważ pandy są tak świetne w całym czasie!

Oto prosty przykład:

def randomDates(size, start=134e7, end=137e7):
    return np.array(np.random.randint(start, end, size), dtype='datetime64[s]')

df = pd.DataFrame({'ship' : randomDates(10), 'recd' : randomDates(10), 
                   'qty' : np.random.randint(0,10,10), 'price' : 100*np.random.random(10)})
df

     price      qty recd                ship
0    14.723510   3  2012-11-30 19:32:27 2013-03-08 23:10:12
1    53.535143   2  2012-07-25 14:26:45 2012-10-01 11:06:39
2    85.278743   7  2012-12-07 22:24:20 2013-02-26 10:23:20
3    35.940935   8  2013-04-18 13:49:43 2013-03-29 21:19:26
4    54.218896   8  2013-01-03 09:00:15 2012-08-08 12:50:41
5    61.404931   9  2013-02-10 19:36:54 2013-02-23 13:14:42
6    28.917693   1  2012-12-13 02:56:40 2012-09-08 21:14:45
7    88.440408   8  2013-04-04 22:54:55 2012-07-31 18:11:35
8    77.329931   7  2012-11-23 00:49:26 2012-12-09 19:27:40
9    46.540859   5  2013-03-13 11:37:59 2013-03-17 20:09:09

Aby sortować według grup cenowych lub ilościowych, mogę użyć wycinania / qcut, aby je wycisnąć:

df.groupby([pd.cut(df['qty'], bins=[0,1,5,10]), pd.qcut(df['price'],q=3)]).count()

                       price  qty recd ship
qty     price               
(0, 1]  [14.724, 46.541]   1   1   1   1
(1, 5]  [14.724, 46.541]   2   2   2   2
        (46.541, 61.405]   1   1   1   1
(5, 10] [14.724, 46.541]   1   1   1   1
        (46.541, 61.405]   2   2   2   2
         (61.405, 88.44]   3   3   3   3

Ale nie widzę żadnego łatwego sposobu na zrobienie tego samego z moimi polami daty „recd” lub „ship”. Na przykład wygeneruj podobną tabelę zliczeń w podziale na (powiedzmy) miesięczne segmenty recd i statku. Wygląda na to, że resample () ma wszystkie maszyny do dzielenia na okresy, ale nie wiem, jak go tutaj zastosować. Segmenty (lub poziomy) w „wycinaniu daty” byłyby równoważne pandas.PeriodIndex, a następnie chcę oznaczyć każdą wartość df ['recd ”] okresem, w którym się ona mieści?

Tak więc wyjście, którego szukam, wyglądałoby następująco:

ship    recv     count
2011-01 2011-01  1
        2011-02  3
        ...      ...
2011-02 2011-01  2
        2011-02  6
...     ...      ...

Bardziej ogólnie, chciałbym móc mieszać i dopasowywać zmienne ciągłe lub kategoryczne w danych wyjściowych. Wyobraź sobie, że df zawiera również kolumnę „status” z czerwonymi / żółtymi / zielonymi wartościami, a może być może chciałbym podsumować zliczenia według stanu, cennika, statku i wiader recd, więc:

ship    recv     price   status count
2011-01 2011-01  [0-10)   green     1
                            red     4
                 [10-20) yellow     2
                  ...      ...    ...
        2011-02  [0-10)  yellow     3
        ...      ...       ...    ...

Jako dodatkowe pytanie, jaki jest najprostszy sposób zmodyfikowania powyższego wyniku groupby (), aby zawierał tylko jedną kolumnę wyjściową o nazwie „count”?

questionAnswers(4)

yourAnswerToTheQuestion