Python: Datetime per condire

voti
2

Voglio convertire una serie storica data per la stagione, ad esempio per mesi 3, 4, 5 voglio sostituirli con 2 (primavera); per mesi 6, 7, 8 voglio sostituirli con 3 (estate), ecc

Così, ho questa serie

id
1       2011-08-20
2       2011-08-23
3       2011-08-27
4       2011-09-01
5       2011-09-05
6       2011-09-06
7       2011-09-08
8       2011-09-09
Name: timestamp, dtype: datetime64[ns]

e questo è il codice che ho cercato di usare, ma senza alcun risultato.

# Get seasons
spring = range(3, 5)
summer = range(6, 8)
fall = range(9, 11)
# winter = everything else

month = temp2.dt.month
season=[]

for _ in range(len(month)):
    if any(x == spring for x in month):
       season.append(2) # spring 
    elif any(x == summer for x in month):
        season.append(3) # summer
    elif any(x == fall for x in month):
        season.append(4) # fall
    else:
        season.append(1) # winter

e

for _ in range(len(month)):
    if month[_] == 3 or month[_] == 4 or month[_] == 5:
        season.append(2) # spring 
    elif month[_] == 6 or month[_] == 7 or month[_] == 8:
        season.append(3) # summer
    elif month[_] == 9 or month[_] == 10 or month[_] == 11:
        season.append(4) # fall
    else:
        season.append(1) # winter

Né soluzione funziona, in particolare nella prima implementazione ricevo un errore:

ValueError: Il valore di verità di un array con più di un elemento è ambigua. Usa a.any () o A.All ()

Mentre nella seconda è una grande lista con gli errori. Tutte le idee per favore? Grazie

È pubblicato 23/05/2017 alle 00:35
dall'utente
In altre lingue...                            


3 risposte

voti
10

È possibile utilizzare una semplice formula matematica per comprimere un mese per una stagione, ad esempio:

>>> [(month%12 + 3)//3 for month in range(1, 13)]
[1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1]

Quindi per la vostra caso d'uso:

>>> temp2.apply(lambda dt: (dt.month%12 + 3)//3)
1    3
2    3
3    3
4    4
5    4
6    4
7    4
8    4
Name: id, dtype: int64

In alternativa usando operazioni vettoriali (@DSM credito):

>>> (temp2.dt.month%12 + 3)//3
1    3
2    3
3    3
4    4
5    4
6    4
7    4
8    4
Name: id, dtype: int64
Risposto il 23/05/2017 a 00:43
fonte dall'utente

voti
0

Penso che questo avrebbe funzionato.

while True:
date=int(input("Date?"))
season=""
if date<4:
    season=1
elif date<7:
    season=2
elif date<10:
    season=3
elif date<13:
    season=4
else:
    print("This would not work.")
print(season)
Risposto il 23/05/2017 a 02:52
fonte dall'utente

voti
0

E ', anche, possibile utilizzare la mappatura dizionario.

  1. Creare un dizionario che mappa un mese per una stagione:

    In [27]: seasons = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1]
    
    In [28]: month_to_season = dict(zip(range(1,13), seasons))
    
    In [29]: month_to_season 
    Out[29]: {1: 1, 2: 1, 3: 2, 4: 2, 5: 2, 6: 3, 7: 3, 8: 3, 9: 4, 10: 4, 11: 4, 12: 1}
    
  2. Usalo per convertire i mesi di stagioni

    In [30]: df.id.dt.month.map(month_to_season) 
    Out[30]: 
    1    3
    2    3
    3    3
    4    4
    5    4
    6    4
    7    4
    8    4
    Name: id, dtype: int64
    

Performance: Questo è abbastanza veloce

In [35]: %timeit df.id.dt.month.map(month_to_season) 
1000 loops, best of 3: 422 µs per loop
Risposto il 11/07/2018 a 14:37
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more