pandasのタイムスタンプからMM-DD-YYYYを取得する 質問する

pandasのタイムスタンプからMM-DD-YYYYを取得する 質問する

日付はPythonでは扱いにくいものらしく、パンダのタイムスタンプから日付を取り除くだけでも大変です。2013-09-29 02:34:44単純に09-29-2013

Created_date 列を持つデータフレームがあります:

Name: Created_Date, Length: 1162549, dtype: datetime64[ns]`

.date()このシリーズにメソッドを適用しようとしましたdf.Created_Date.date()が、エラーが発生します。AttributeError: 'Series' object has no attribute 'date'

誰か助けてくれませんか?

ベストアンサー1

map要素について:

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

を構成する要素の メソッドdatetime.dateを呼び出すことで、生のオブジェクトを取得できます。date()TimestampSeries

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)

まだ別のこれを行うには、unboundTimestamp.dateメソッドを呼び出します。

In [273]: s.map(Timestamp.date)
Out[273]:
0    2013-10-01
1    2013-10-02
dtype: object

この方法は最も高速で、私見では最も読みやすいです。次のように、Timestampトップレベル モジュールでアクセスできます。説明のために直接インポートしました。pandaspandas.Timestamp

dateオブジェクトの属性も同様DatetimeIndexの機能を実行しますが、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)

より大きなdatetime64[ns] Seriesオブジェクトの場合、 の呼び出しはTimestamp.dateよりも高速でありoperator.methodcaller、 よりもわずかに高速です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

の目標の 1 つは、pandasの上にレイヤーを提供することです。numpyこれにより、(ほとんどの場合) の低レベルの詳細を処理する必要がなくなりますndarray。そのため、配列内の生のオブジェクトを取得することは、でサポートされているdatetime.dateいずれのオブジェクトにも対応しないため、用途が限られます(は [ナノ秒単位] の dtypeのみをサポートします)。とはいえ、これを行う必要がある場合もあります。numpy.dtypepandaspandasdatetime64[ns]

おすすめ記事