回答:
タイプとして使用
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
df['time'] = [time.date() for time in df['time']]
基本的に@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
取り扱いValueError
s
する状況に遭遇した場合
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')
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を参照してください
今できる df['column'].dt.date
日時オブジェクトの場合、すべてが00:00:00である時間を表示しない場合、それはパンダではないことに注意してください。これは、見栄えをよくするためのiPythonノートブックです。
df[col] = pd.to_datetime(df[col])
列を日時オブジェクトに変換するために、最初に行う必要がある場合があります。
dtype = object
trueよりもかなり多くのメモリを必要とする列に変換されることdatetime dtype
です。
これを行うもう1つの方法は、日時に変換する列が複数ある場合に有効です。
cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
date
は、列に値しかない限り、datetimeへの変換では関連情報のみが保持されます。それを使用しdf['datetime_col'].dt.date
て明示的に変換すると、object
dtypeになります。メモリ管理の喪失。
DATETIME形式ではなくDATE形式を取得する場合:
df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
日付を別の頻度に変換する必要がある場合もあります。この場合、日付でインデックスを設定することをお勧めします。
#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'>
pd.to_datetime関数を使用して行の1つをタイムスタンプに変換してから、.mapを使用して式を列全体にマッピングします
# 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]