pandasのread_csvは、読み込み時によしなに列ごとに型を割り振ってくれますが、日付型は認識してくれません。
なので、日付型で読み込む列を明示的に指定してやる必要があります。

この記事では、ダミーデータを作り、どういうケース別で日付列を指定しての読み込みを行ないます。

ダミーデータフレームを作って一度書き出し、再度読み込む

import pandas as pd
import numpy as np

# データフレームの作成
df = pd.DataFrame({
    'test1' : np.array([1,2,3,4]),
    'test2' : np.array(['20130102'] * 4)
})

# データフレームをcsvファイルへ書き出し
df.to_csv('date_test1.csv', index=False)

# 書き出したcsvファイルを読み込み
date_test1 = pd.read_csv('date_test1.csv')

上記のdata_test1確認すると、以下のようになります。

データの中身を確認

In [32]: date_test1
Out[32]:
   test1     test2
0      1  20130102
1      2  20130102
2      3  20130102
3      4  20130102

データの型を確認

In [33]: date_test1.dtypes
Out[33]:
test1    int64
test2    int64
dtype: object

この状態ですとtest2列にある値「20130102」が日付型として認識されません。

pd.read_csvのparse_datesオプションを利用する

例1(列番号指定)

# 2列目のtest2を日付型として読み込む
date_test1 = pd.read_csv('date_test1.csv', parse_dates = [1])

または、列名の指定しての読み込み

例1(列名指定)

# 2列目のtest2を日付型として読み込む
date_test1 = pd.read_csv('date_test1.csv', parse_dates = ['test2'])
date_test1.head()

結果を確認するとちゃんと日付型として認識されています。

例1の結果(データの中身を確認)

In [36]: date_test1.head()
Out[36]:
   test1      test2
0      1 2013-01-02
1      2 2013-01-02
2      3 2013-01-02
3      4 2013-01-02

例1の結果(データの型を確認)

In [37]: date_test1.dtypes
Out[37]:
test1             int64
test2    datetime64[ns]
dtype: object

pandasの日付型の年月日のフォーマットは、yyyy-mm-ddが標準ですので、そのように変換がなされています。

上記では、「20130102」のようなyyyymmddのフォーマットを取り扱いましたが、以下のフォーマットでも,parse_datesをつければ自動的に日付型に変換してくれます。(あくまで一例です)

  • 2013/1/2のようなスラッシュ区切りの場合
  • 2013-1-2のような、月日の桁が2桁に統一されていない場合
  • 2013.01.02のような、ドット区切りの場合
  • 02.JAN.13のような、月が英語の省略になっている場合

pd.read_csvのparse_datesオプションを、日付フォーマットを指定して利用する

しかしながら、「2013年1月2日」のような日本語が入っている場合や、年月日の順番が特殊な場合は、上記のようにparse_datesオプションを指定するだけでは意図通りの結果になりません。
この場合、test2列に入っている日付フォーマットはこれですよ、と指定する必要があります。

例2

import pandas as pd
import numpy as np

# データフレームの作成(特殊な日付を作る)
df = pd.DataFrame({
    'test1' : np.array([1,2,3,4]),
    'test2' : np.array(['2013年1月2日'] * 4)
})

# データフレームをcsvファイルへ書き出し
df.to_csv('date_test2.csv', index=False)

# フォーマット指定
format = '%Y年%m月%d日'

# 上で作ったフォーマットを適用するパーサを作成
parser = lambda date: pd.datetime.strptime(date, format)

# test2列を指定したフォーマットに従って日付型で読み込み
date_test2 = pd.read_csv('date_test2.csv', parse_dates = [1], date_parser = parser)

例2の結果(データの中身を確認)

In [41]: date_test2.head()
Out[41]:
   test1      test2
0      1 2013-01-02
1      2 2013-01-02
2      3 2013-01-02
3      4 2013-01-02

例2の結果(データの型を確認)

In [42]: date_test2.dtypes
Out[42]:
test1             int64
test2    datetime64[ns]
dtype: object

基本的には上記で解決できる問題は多いと思いますが、世の中には不思議な日付のフォーマットがたくさんあります。
特殊な日付型の取り扱いについては別記事参照願います。

また、時間・分・秒についても取り扱っていないので、こちらも別記事にて。