2016-12-09 6 views
1

Je prends ma colonne de date dans mon dataframe et en fait une chaîne pour enlever l'élément de temps quand je l'écris pour exceler. Pour une raison quelconque, je ne peux pas sembler écrire la date dans le format suivant dont j'ai besoin qui est (10/2/2016). Je peux le faire apparaître dans ce format (10/02/2016) mais deux questions se posent - J'ai besoin que le jour soit à un chiffre et non à deux et ne soit pas non plus dans l'ordre des dates (il semble s'agir du mois et pas l'année que le mois que le jour).Mise en forme de strftime Datetime

Voici mon code:

df8 = df.set_index('DATE').resample('W-WED').apply(pd.DataFrame.tail, n=1) 
df8.index= df8.index.droplevel(0) 
df8 = df8.reset_index('DATE', drop=False) 
df8['DATE'] = pd.to_datetime(df8['DATE']).apply(lambda x:x.date().strftime('%m/%d/%Y')) 

données d'échantillon (c'est ce qui montre la mise en forme ci-dessus)

DATE  Distance (cm) 
01/02/2013 206.85 
01/04/2012 315.33 
01/05/2011 219.46 
01/06/2016 180.44 
01/07/2015 168.55 
01/08/2014 156.89 
+0

Vous devez envoyer des données d'échantillon pour nous aider. –

+0

@Ted Petrou - J'ai édité ci-dessus afin que je puisse ajouter quelques exemples de données de ce que le code ci-dessus était en train d'imprimer. Encore une fois, je cherche la date à imprimer comme 01/2/2013, 04/01/2012, 01/05/2011 etc Il semble aussi ne plus imprimer dans l'ordre de la date, mais plutôt le séquençage sur le mois, puis le jour et ensuite l'année. – spacedinosaur10

Répondre

2

Vous pouvez utiliser dt.day au lieu de %d directive qui supprime automatiquement les zéros pour donner les chaînes de date au format désiré comme indiqué:

pd.to_datetime(df8['DATE']).map(lambda x: '{}/{}/{}'.format(x.month, x.day, x.year)) 

Démo:

df = pd.DataFrame(dict(date=['2016/10/02', '2016/10/03', 
          '2016/10/04', '2016/10/05', '2016/10/06'])) 

>>> pd.to_datetime(df['date']).map(lambda x: '{}/{}/{}'.format(x.month, x.day, x.year)) 
0 10/2/2016 
1 10/3/2016 
2 10/4/2016 
3 10/5/2016 
4 10/6/2016 
Name: date, dtype: object 

EDIT à partir des données d'échantillon ajouté:

Inorder pour qu'elle n'a qu'une incidence les jours et des mois, nous devons remplir/pad sur le côté gauche des chaînes contenant l'attribut .month des 0 à l'aide str.zfill ayant un paramètre de largeur égale à 2, de sorte que les mois à un seul chiffre soient remplis avec 0 et ceux à deux chiffres restent inchangés.

>>> pd.to_datetime(df['DATE']).map(lambda x: '{}/{}/{}'.format(str(x.month).zfill(2), x.day, x.year)) 
0 01/2/2013 
1 01/4/2012 
2 01/5/2011 
3 01/6/2016 
4 01/7/2015 
5 01/8/2014 
Name: DATE, dtype: object 
+1

Ceci est super utile et a été une grande expérience d'apprentissage pour moi, merci beaucoup. Le seul problème que j'ai toujours est que j'ai besoin de la colonne de date pour être en ordre de la plus ancienne date à la dernière date. Par exemple - 01/5/2011, 01/4/2012, 01/02/2013 .. etc. De toute façon nous pouvons le faire? – spacedinosaur10

+1

De rien! Si vous voulez trier les chaînes de date, il vaudrait mieux que vous convertissiez d'abord votre colonne 'object' * DATE * en' datetime' en utilisant 'pd.to_datetime'. Triez le 'DF' basé sur cette colonne, comme' df.sort_values ​​(by = ['DATE'], inplace = True) '. Maintenant, votre «DF» est dans l'ordre croissant des dates. Après cela, utilisez simplement la syntaxe fournie dans ma réponse, mais cette fois sans la partie 'to_datetime' car ils sont déjà dans le type' datetime64'. Faites-moi savoir comment ça se passe à partir de là. –

0

De here, vous pouvez faire le jour zéro rembourré en utilisant

Code  Meaning           Example 
%m  Month as a zero-padded decimal number.    09 
%-m  Month as a decimal number. (Platform specific)  9 

Il faut donc utiliser %-m au lieu de %m

+0

Cela ne fonctionne pas sur Windows si je me souviens bien. – ayhan

+0

@ayhan qui explique la remarque "plate-forme spécifique". Dommage. Je vais toujours le laisser ici pour l'avenir. non-windows, utilisateurs – Mathias711

+0

@ Mathias711 - Oui, j'ai fatigué cela et cela n'a pas fonctionné et j'utilise Windows. – spacedinosaur10