Mon exigence est de considérer les points de données pour une certaine plage.

Comme indiqué ci-dessous

train_period = [
['7-31-2013', '12-31-2014'],
['8-31-2013', '1-31-2015'],
['9-31-2013', '2-28-2015'],
['10-31-2013','3-31-2015'],
['11-31-2013', '4-30-2015']
]

Mais python les différencie, quand je donne sans guillemets. Je les ai donc pris comme chaîne mais lors de la conversion des chaînes en dates en utilisant le code ci-dessous, j'ai eu une erreur comme

"Type Error: strptime() argument 1 must be str, not list"

DATE = [datetime.strptime(x,'%m/%d/%Y %H:%M') for x in train_period]

Je sais que c'est à cause de la liste des listes. Veuillez aider à résoudre le problème.

2
Ashok 11 mars 2019 à 09:11

2 réponses

Meilleure réponse

Selon le résultat que vous souhaitez utiliser, utilisez l'un de ces deux opérateurs de compréhension de liste:

  • Le premier vous donnera une liste de liste
  • Le second vous donnera une liste plate

Code:

from datetime import datetime

train_period = [
['7-31-2013', '12-31-2014'],
['8-31-2013', '1-31-2015'],
['9-30-2013', '2-28-2015'],
['10-31-2013','3-31-2015'],
['11-30-2013', '4-30-2015']
]


DATE = [[datetime.strptime(y,'%m-%d-%Y') for y in x] for x in train_period]
print(DATE)
print("====")
DATE = [datetime.strptime(y,'%m-%d-%Y') for x in train_period for y in x]
print(DATE)

Sortie:

[[datetime.datetime(2013, 7, 31, 0, 0), datetime.datetime(2014, 12, 31, 0, 0)], [datetime.datetime(2013, 8, 31, 0, 0), datetime.datetime(2015, 1, 31, 0, 0)], [datetime.datetime(2013, 9, 30, 0, 0), datetime.datetime(2015, 2, 28, 0, 0)], [datetime.datetime(2013, 10, 31, 0, 0), datetime.datetime(2015, 3, 31, 0, 0)], [datetime.datetime(2013, 11, 30, 0, 0), datetime.datetime(2015, 4, 30, 0, 0)]]
====
[datetime.datetime(2013, 7, 31, 0, 0), datetime.datetime(2014, 12, 31, 0, 0), datetime.datetime(2013, 8, 31, 0, 0), datetime.datetime(2015, 1, 31, 0, 0), datetime.datetime(2013, 9, 30, 0, 0), datetime.datetime(2015, 2, 28, 0, 0), datetime.datetime(2013, 10, 31, 0, 0), datetime.datetime(2015, 3, 31, 0, 0), datetime.datetime(2013, 11, 30, 0, 0), datetime.datetime(2015, 4, 30, 0, 0)]

Vous devez également changer votre modèle pour l'horodatage en %m-%d-%Y sinon vous aurez des erreurs car datetime ne peut pas interpréter la chaîne et construire un objet date.

ValueError: time data '7-31-2013' does not match format '%m-%d-%Y %H:%M'

Last but not least, votre chaîne doit être des dates valides !!! (il n'y a ni 31st of Sept ni 31st of Nov)

1
Allan 11 mars 2019 à 06:33

Utilisez simplement une compréhension de liste imbriquée:

from datetime import datetime

train_period = [
['7-31-2013', '12-31-2014'],
['8-31-2013', '1-31-2015'],
['9-31-2013', '2-28-2015'],
['10-31-2013','3-31-2015'],
['11-31-2013', '4-30-2015']
]

DATE = [[datetime.strptime(y,'%m/%d/%Y %H:%M') for y in x] for x in train_period]

Notez que votre modèle est incorrect. Essayez %m-%d-&Y. Cependant, vos données contiennent un 31 septembre et un 31 novembre, vous devrez donc y remédier.

2
iz_ 11 mars 2019 à 06:17