J'ai un Dataframe, df, avec la colonne suivante:
df['ArrivalDate'] =
...
936 2012-12-31
938 2012-12-29
965 2012-12-31
966 2012-12-31
967 2012-12-31
968 2012-12-31
969 2012-12-31
970 2012-12-29
971 2012-12-31
972 2012-12-29
973 2012-12-29
...
Les éléments de la colonne sont pandas.tslib.Timestamp.
Je veux juste inclure l'année et le mois. Je pensais qu'il y aurait un moyen simple de le faire, mais je ne peux pas le comprendre.
Voici ce que j'ai essayé:
df['ArrivalDate'].resample('M', how = 'mean')
J'ai eu l'erreur suivante:
Only valid with DatetimeIndex or PeriodIndex
J'ai ensuite essayé:
df['ArrivalDate'].apply(lambda(x):x[:-2])
J'ai eu l'erreur suivante:
'Timestamp' object has no attribute '__getitem__'
Aucune suggestion?
Edit: j'ai en quelque sorte compris.
df.index = df['ArrivalDate']
Ensuite, je peux rééchantillonner une autre colonne en utilisant l'index.
Mais j'aimerais toujours une méthode pour reconfigurer la colonne entière. Des idées?
to_period
:df.date_column.dt.month
(ou.year
, ou.day
) travaux.dt.month
perd cependant l'année. Et.dt.to_period('M')
change le type de données en quelque chose qui n'est plus un datetime64. J'ai fini par utiliser la réponse de Juan suggérant.astype('datetime64[M]')
de tronquer les valeurs.Réponses:
Si vous souhaitez de nouvelles colonnes affichant l'année et le mois séparément, vous pouvez le faire:
ou...
Ensuite, vous pouvez les combiner ou travailler avec eux tels quels.
la source
timeit
suggère que l'DatetimeIndex
approche est beaucoup plus rapide que l'un.map/.apply
ou l' autre.dt
.df['date_column_trunc'] = df[date_column'].apply(lambda s: datetime.date(s.year, s.month, 1)
Le meilleur moyen trouvé !!
le
df['date_column']
doit être au format date-heure.Vous pouvez également utiliser
D
pour le jour,2M
pendant 2 mois, etc. pour différents intervalles d'échantillonnage, et dans le cas où l'on a des données de série chronologique avec horodatage, nous pouvons opter pour des intervalles d'échantillonnage granulaires tels que45Min
45 min,15Min
15 min d'échantillonnage, etc.la source
datetime64
dtype. Utiliserdf.my_date_column.astype('datetime64[M]')
, comme dans @ Juan, la réponse se convertit en dates représentant le premier jour de chaque mois.Vous pouvez accéder directement aux attributs
year
etmonth
, ou demanderdatetime.datetime
:Une façon de combiner année et mois est de faire un entier les encodant, comme:
201408
pour août 2014. Le long d'une colonne entière, vous pouvez le faire comme:ou de nombreuses variantes de celui-ci.
Cependant, je ne suis pas un grand fan de cela, car cela rend l'alignement des dates et l'arithmétique douloureux plus tard et particulièrement douloureux pour les autres qui rencontrent votre code ou vos données sans cette même convention. Une meilleure façon est de choisir une convention de jour du mois, comme le dernier jour de semaine non américain, ou le premier jour, etc., et de laisser les données dans un format date / heure avec la convention de date choisie.
Le
calendar
module est utile pour obtenir la valeur numérique de certains jours comme le dernier jour de la semaine. Ensuite, vous pourriez faire quelque chose comme:Si vous cherchez un moyen de résoudre le problème plus simple de simplement formater la colonne datetime en une représentation chaîne, pour cela, vous pouvez simplement utiliser la
strftime
fonction de ladatetime.datetime
classe, comme ceci:la source
pandas
techniques de fractionnement-application-combinaison. Mes suggestions ci-dessus ne sont pas censées être considérées comme une approbation du fait que ce sont les approches les plus performantes pour votre cas - juste qu'elles sont des choix Pythoniques stylistiquement valables pour une gamme de cas.df['YearMonth'] = df['ArrivalDate'].map(lambda x: 1000*x.year + x.month)
.Si vous voulez la paire unique mois-année, l'utilisation de Apply est assez élégante.
Sorties mois-année dans une colonne.
N'oubliez pas de changer d'abord le format en date-heure avant, j'oublie généralement.
la source
df['month_year'] = df['date_column'].dt.strftime('%B-%Y')
Extraire le dire de l'année du ['2018-03-04']
Le df ['Year'] crée une nouvelle colonne. Alors que si vous voulez extraire le mois, utilisez simplement .month
la source
Vous pouvez d'abord convertir vos chaînes de date avec pandas.to_datetime , ce qui vous donne accès à toutes les fonctions numpy datetime et timedelta . Par exemple:
la source
trunc
. Y a-t-il une documentation pour laastype('datetime64[M]')
convention?Grâce à jaknap32 , je voulais agréger les résultats selon l'année et le mois, donc cela a fonctionné:
La sortie était soignée:
la source
La solution de @ KieranPC est la bonne approche pour les pandas, mais n'est pas facilement extensible pour des attributs arbitraires. Pour cela, vous pouvez utiliser
getattr
au sein d'une compréhension de générateur et combiner en utilisantpd.concat
:la source
Cela a bien fonctionné pour moi, je ne pensais pas que les pandas interpréteraient la date de chaîne résultante comme une date, mais quand j'ai fait l'intrigue, il connaissait très bien mon agenda et la chaîne year_month était correctement commandée ... je dois aimer les pandas!
la source
Il y a deux étapes pour extraire l'année pour toutes les trames de données sans utiliser de méthode.
Étape 1
convertir la colonne en datetime:
Étape 2
extraire l'année ou le mois en utilisant la
DatetimeIndex()
méthodela source
SINGLE LINE: Ajout d'une colonne avec des paires 'année-mois': ('pd.to_datetime' change d'abord le type de colonne en date-heure avant l'opération)
En conséquence, pour une colonne supplémentaire «année» ou «mois»:
la source