web-dev-qa-db-ja.com

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

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

現時点では、列のdtypeは「オブジェクト」です。

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

76
user7289

astype を使用します

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
79
waitingkuo

基本的に@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.NaTに変換しても問題ない場合は、errors='coerce'引数をto_datetimeに追加できます。

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

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

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

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html を参照してください

25
fantabolous

これでdf['column'].dt.dateを実行できます

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

18
szeitlin

これを行う別の方法は、datetimeに変換する列が複数ある場合に有効です。

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

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

#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
Ted M.