Pandasデータフレームの日付を「日付」データ型に変換するにはどうすればよいですか?


103

Pandasデータフレームがあります。列の1つに日付形式の形式の文字列が含まれています YYYY-MM-DD

例えば '2013-10-28'

現時点でdtypeは、列のはobjectです。

列の値をPandasの日付形式に変換するにはどうすればよいですか?

回答:


108

タイプとして使用

In [31]: df
Out[31]: 
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [32]: df['time'] = df['time'].astype('datetime64[ns]')

In [33]: df
Out[33]: 
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00

1
ニース-ありがとう-各日付の終わりに00:00:00を取り除くにはどうすればよいですか?
user7289 2013年

1
パンダのタイムスタンプには日付と時刻の両方があります。それをPythonの日付オブジェクトに変換することを意味しますか?
waitingkuo 2013年

6
次の方法で変換できますdf['time'] = [time.date() for time in df['time']]
waitingkuo 2013年

3
[ns]はどういう意味ですか、テキスト文字列を日付にして、その日付の時間部分を削除できますか?
yoshiserry 2014年

1
@yoshiserryそれはナノ秒であり、日付が適切に変換された後、内部で日付が格納される方法です(エポック時間(ナノ秒))。
アンディヘイデン、

111

基本的に@waitingkuoと同等ですが、to_datetimeここではこれを使用します(少しすっきりし、いくつかの追加機能を提供しますdayfirst)。

In [11]: df
Out[11]:
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [12]: pd.to_datetime(df['time'])
Out[12]:
0   2013-01-01 00:00:00
1   2013-01-02 00:00:00
2   2013-01-03 00:00:00
Name: time, dtype: datetime64[ns]

In [13]: df['time'] = pd.to_datetime(df['time'])

In [14]: df
Out[14]:
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00

取り扱いValueErrors
する状況に遭遇した場合

df['time'] = pd.to_datetime(df['time'])

をスローします

ValueError: Unknown string format

これは、無効な(強制できない)値があることを意味します。それらをに変換することに問題がなければpd.NaTerrors='coerce'引数をto_datetime次のように追加できます。

df['time'] = pd.to_datetime(df['time'], errors='coerce')

こんにちはみんな、@ AndyHaydenは日付から時間の部分を削除できますか?その部分はいらない?
yoshiserry 2014年

パンダの0.13.1では、末尾の00:00:00は表示されません。
アンディヘイデン

そして、他のバージョンではどうですか、それらをどのように削除/表示しないのですか?
yoshiserry 2014年

私はこれが良い方法でできるとは思いません、float_formatのようなdate_formatを追加するための議論があります(これは見ました)。とにかくアップグレードをお勧めします。
アンディ・ヘイデン

私の問題は、日付がこの形式になっていることです... 41516.43、このエラーが発生します。新しい列に2014-02-03のようなものが返されると思いますか?!エラー:「load_date」列の日付値を日付に変換しますbudget_dataset ['date_last_load'] = pd.to_datetime(budget_dataset ['load_date'])budget_dataset -c:2:SettingWithCopyWarning:値を設定しようとしていますDataFrameからのスライスのコピー。代わりに.loc [row_index、col_indexer] = valueを使用してみてください
yoshiserry

35

CSVファイルからPandasに大量のデータが入ると思います。この場合、最初のCSVの読み取り中に日付を変換するだけです。

dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])ここで、0は日付が含まれる列を指します。日付をインデックスにする場合は、そこに
追加することもでき, index_col=0ます。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.htmlを参照してください


ありがとう、それがまさに私が必要としていたことでした。ドキュメントは、しかし、あなたはここでそれを見つけることができ、移動しました:pandas.pydata.org/pandas-docs/stable/reference/api/...
Sastibe

24

今できる df['column'].dt.date

日時オブジェクトの場合、すべてが00:00:00である時間を表示しない場合、それはパンダではないことに注意してください。これは、見栄えをよくするためのiPythonノートブックです。


2
これは私にはうまくいきません、それは不平を言います:datetimelike値でのみ.dtアクセサーを使用できます
smishra

2
df[col] = pd.to_datetime(df[col])列を日時オブジェクトに変換するために、最初に行う必要がある場合があります。
szeitlin

この回答の問題は、パンダのdtype = objecttrueよりもかなり多くのメモリを必要とする列に変換されることdatetime dtypeです。
elPastor

6

これを行うもう1つの方法は、日時に変換する列が複数ある場合に有効です。

cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)

質問は日時ではなく日付を尋ねます。
Mark Andersen、

@MarkAndersen dateは、列に値しかない限り、datetimeへの変換では関連情報のみが保持されます。それを使用しdf['datetime_col'].dt.dateて明示的に変換すると、objectdtypeになります。メモリ管理の喪失。
Sumanth Lazarus


1

日付を別の頻度に変換する必要がある場合もあります。この場合、日付でインデックスを設定することをお勧めします。

#set an index by dates
df.set_index(['time'], drop=True, inplace=True)

この後、最も必要な日付形式のタイプに簡単に変換できます。以下では、いくつかの日付形式に順次変換していき、最終的には月の初めに毎日の日付のセットが生成されます。

#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)

#Convert to monthly dates
df.index = df.index.to_period(freq='M')

#Convert to strings
df.index = df.index.strftime('%Y-%m')

#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)

簡潔にするために、上記の各行の後に次のコードを実行することは示していません。

print(df.index)
print(df.index.dtype)
print(type(df.index))

これにより、次の出力が得られます。

Index(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='object', name='time')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='datetime64[ns]', name='time', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

PeriodIndex(['2013-01', '2013-01', '2013-01'], dtype='period[M]', name='time', freq='M')
period[M]
<class 'pandas.core.indexes.period.PeriodIndex'>

Index(['2013-01', '2013-01', '2013-01'], dtype='object')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-01', '2013-01-01'], dtype='datetime64[ns]', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>


0
 #   Column          Non-Null Count   Dtype         
---  ------          --------------   -----         
 0   startDay        110526 non-null  object
 1   endDay          110526 non-null  object

import pandas as pd

df['startDay'] = pd.to_datetime(df.startDay)

df['endDay'] = pd.to_datetime(df.endDay)

 #   Column          Non-Null Count   Dtype         
---  ------          --------------   -----         
 0   startDay        110526 non-null  datetime64[ns]
 1   endDay          110526 non-null  datetime64[ns]

0

完全を期すために、@ SSSによって提案されたものと少し似ているが、最も単純なオプションではないかもしれないが、datetimeライブラリを使用する別のオプションは次のとおりです。

import datetime
df["Date"] = df["Date"].apply(lambda x: datetime.datetime.strptime(x, '%Y-%d-%m').date())
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.