les dates semblent être une chose délicate en python, et j’ai beaucoup de mal à simplement supprimer la date du pandas TimeStamp. J'aimerais passer de 2013-09-29 02:34:44
à tout simplement 09-29-2013
J'ai un dataframe avec une colonne Created_date:
Name: Created_Date, Length: 1162549, dtype: datetime64[ns]`
J'ai essayé d'appliquer la méthode .date()
sur cette série, par exemple: df.Created_Date.date()
, mais l'erreur AttributeError: 'Series' object has no attribute 'date'
s'affiche.
Est-ce que quelqu'un peut m'aider?
map
sur les éléments:
In [239]: from operator import methodcaller
In [240]: s = Series(date_range(Timestamp('now'), periods=2))
In [241]: s
Out[241]:
0 2013-10-01 00:24:16
1 2013-10-02 00:24:16
dtype: datetime64[ns]
In [238]: s.map(lambda x: x.strftime('%d-%m-%Y'))
Out[238]:
0 01-10-2013
1 02-10-2013
dtype: object
In [242]: s.map(methodcaller('strftime', '%d-%m-%Y'))
Out[242]:
0 01-10-2013
1 02-10-2013
dtype: object
Vous pouvez obtenir les objets datetime.date
bruts en appelant la méthode date()
des éléments Timestamp
qui constituent la Series
:
In [249]: s.map(methodcaller('date'))
Out[249]:
0 2013-10-01
1 2013-10-02
dtype: object
In [250]: s.map(methodcaller('date')).values
Out[250]:
array([datetime.date(2013, 10, 1), datetime.date(2013, 10, 2)], dtype=object)
Pourtant, la autre manière de procéder consiste à appeler la méthode non liée Timestamp.date
:
In [273]: s.map(Timestamp.date)
Out[273]:
0 2013-10-01
1 2013-10-02
dtype: object
Cette méthode est la plus rapide et IMHO la plus lisible. Timestamp
est accessible dans le module pandas
de niveau supérieur, comme suit: pandas.Timestamp
. Je l'ai importé directement à des fins d'exposition.
L'attribut date
des objets DatetimeIndex
a le même effet, mais renvoie à la place un tableau d'objets numpy
:
In [243]: index = DatetimeIndex(s)
In [244]: index
Out[244]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-10-01 00:24:16, 2013-10-02 00:24:16]
Length: 2, Freq: None, Timezone: None
In [246]: index.date
Out[246]:
array([datetime.date(2013, 10, 1), datetime.date(2013, 10, 2)], dtype=object)
Pour les objets datetime64[ns]
Series
plus grands, l'appel de Timestamp.date
est plus rapide que operator.methodcaller
, ce qui est légèrement plus rapide qu'un lambda
:
In [263]: f = methodcaller('date')
In [264]: flam = lambda x: x.date()
In [265]: fmeth = Timestamp.date
In [266]: s2 = Series(date_range('20010101', periods=1000000, freq='T'))
In [267]: s2
Out[267]:
0 2001-01-01 00:00:00
1 2001-01-01 00:01:00
2 2001-01-01 00:02:00
3 2001-01-01 00:03:00
4 2001-01-01 00:04:00
5 2001-01-01 00:05:00
6 2001-01-01 00:06:00
7 2001-01-01 00:07:00
8 2001-01-01 00:08:00
9 2001-01-01 00:09:00
10 2001-01-01 00:10:00
11 2001-01-01 00:11:00
12 2001-01-01 00:12:00
13 2001-01-01 00:13:00
14 2001-01-01 00:14:00
...
999985 2002-11-26 10:25:00
999986 2002-11-26 10:26:00
999987 2002-11-26 10:27:00
999988 2002-11-26 10:28:00
999989 2002-11-26 10:29:00
999990 2002-11-26 10:30:00
999991 2002-11-26 10:31:00
999992 2002-11-26 10:32:00
999993 2002-11-26 10:33:00
999994 2002-11-26 10:34:00
999995 2002-11-26 10:35:00
999996 2002-11-26 10:36:00
999997 2002-11-26 10:37:00
999998 2002-11-26 10:38:00
999999 2002-11-26 10:39:00
Length: 1000000, dtype: datetime64[ns]
In [269]: timeit s2.map(f)
1 loops, best of 3: 1.04 s per loop
In [270]: timeit s2.map(flam)
1 loops, best of 3: 1.1 s per loop
In [271]: timeit s2.map(fmeth)
1 loops, best of 3: 968 ms per loop
N'oubliez pas que l'un des objectifs de pandas
est de fournir une couche au-dessus de numpy
afin que (la plupart du temps) vous n'ayez pas à traiter avec les détails de bas niveau de ndarray
. Donc, obtenir les objets datetime.date
bruts dans un tableau est d'une utilité limitée car ils ne correspondent à aucun numpy.dtype
pris en charge par pandas
(pandas
ne supporte que datetime64[ns]
[c'est nanosecondes] dtypes). Cela dit, vous devez parfois le faire.
Cela n’est peut-être arrivé que récemment, mais il existe des méthodes intégrées. Essayer:
In [27]: s = pd.Series(pd.date_range(pd.Timestamp('now'), periods=2))
In [28]: s
Out[28]:
0 2016-02-11 19:11:43.386016
1 2016-02-12 19:11:43.386016
dtype: datetime64[ns]
In [29]: s.dt.to_pydatetime()
Out[29]:
array([datetime.datetime(2016, 2, 11, 19, 11, 43, 386016),
datetime.datetime(2016, 2, 12, 19, 11, 43, 386016)], dtype=object)
Vous pouvez essayer d'utiliser .dt.date
sur datetime64[ns]
de dataframe
.
Par exemple df['Created_date'] = df['Created_date'].dt.date
Entrez dataframe
nommé test_df
:
print(test_df)
Résultat:
Created_date
0 2015-03-04 15:39:16
1 2015-03-22 17:36:49
2 2015-03-25 22:08:45
3 2015-03-16 13:45:20
4 2015-03-19 18:53:50
Vérification dtypes
:
print(test_df.dtypes)
Résultat:
Created_date datetime64[ns]
dtype: object
Extraction de date
et mise à jour de la colonne Created_date
:
test_df['Created_date'] = test_df['Created_date'].dt.date
print(test_df)
Résultat:
Created_date
0 2015-03-04
1 2015-03-22
2 2015-03-25
3 2015-03-16
4 2015-03-19
eh bien, je referais ce chemin.
pdTime =pd.date_range(timeStamp, periods=len(years), freq="D")
pdTime[i].strftime('%m-%d-%Y')