2017-11-11 15 views
1

私はdfです。ほとんどのエントリが'yyyymmdd'の日付文字列ですが、'nan'の値もあります。ここで、これらの'nan'はfloat nanの代わりに文字列です。今私はpd.isnullによって検出されることができるnanの値をNaN,NaTなどに変換しながら、dfのすべての日付文字列をpandas datetime形式に変換したいと思います。pandas to_datetimeが期待どおりに動作しない

errors引数を使用してpd.to_datetime関数を使用するとすぐに考えられます。デフォルト'raise'

errors : {'ignore', 'raise', 'coerce'}、文書で述べたように - 'raise'場合は、無効な構文解析は例外
を発生させます - 'coerce'場合は、無効な解析がNaT
として設定されます - 'ignore'場合には、無効な解析によって入力が返されます

したがって、私はすべての値がstrあるとさえ

  001002.XY 600123.AB 123456.YZ 555555.GO 
ipo_date  20100203 20150605  nan 20090501 
delist_date  nan 20170801  nan  nan 

実際'nan'です。私はその後、私を投げる、pd.to_datetime(df, errors='coerce')を試してみました:

Traceback (most recent call last): 
    File "D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-27-43c41318d6ab>", line 1, in <module> 
    pd.to_datetime(df, errors='coerce') 
    File "D:\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py", line 512, in to_datetime 
    result = _assemble_from_unit_mappings(arg, errors=errors) 
    File "D:\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py", line 591, in _assemble_from_unit_mappings 
    "[{0}] is missing".format(','.join(req))) 
ValueError: to assemble mappings requires at least that [year, month, day] be specified: [day,month,year] is missing 

しかし、私は、個々の細胞をしようとした場合、それが正常に働いた:私は何が起こったのかを把握することはできません

pd.to_datetime(df.iloc[0, 0]) 
Out[33]: 
Timestamp('2010-02-03 00:00:00') 
pd.to_datetime(df.iloc[1, 0]) 
Out[34]: 
NaT 

。私はあまりにも個々の列でテストし、彼らはうまく働い:

df.dtypes 
Out[35]: 
001002.XY object 
600123.AB object 
123456.YZ object 
555555.GO object 
dtype: object 

しかし、これは犯人ではないようです:それはしかし価値がある何のために、すべての列がobjectdtypeとして持って

pd.to_datetime(df.iloc[:, 0]) 
Out[36]: 
ipo_date  2010-02-03 
delist_date   NaT 
Name: 001002.XY, dtype: datetime64[ns] 

誰かが助けたり説明したりできますか?ありがとう!

答えて

1

それは少し異なる行われるべきである - すべての列にpd.to_datetimeを適用する: - :二時間、分、それは、必要に応じて(年、月、日などの列を期待

In [6]: df.apply(pd.to_datetime, errors='coerce') 
Out[6]: 
      001002.XY 600123.AB 123456.YZ 555555.GO 
ipo_date 2010-02-03 2015-06-05  NaT 2009-05-01 
delist_date  NaT 2017-08-01  NaT  NaT 

あなたはpd.to_datetime()にデータフレームを渡す場合)を使用して、別々の列の日時を結合します。データフレームの複数の列から日時を組み立てる

docsから

。[yearmonthdayminutesecondmsusns]のような一般的な略語でき キー)、または同じ

の複数形
+0

ありがとう!私は実際に文書で提供されている例を参照する必要があります。 'Series'で動作するので、' applymap'のように、 'DataFrame'で動作すると当然期待しています。しかし、それはしません。 – Vim

+0

@Vim、あなたも大歓迎です:) – MaxU

関連する問題