2016-12-29 41 views
1

私は巨大なsensor dataを持っており、Pythonに取り組んでいます。問題はdate formatsです。基本的に、これは日付列の様子です。 恐ろしい日付データを扱うデータを扱う

07/ 7/15 06:51 

07/ 7/15 06:53 

07/ 7/15 06:55 

07/ 7/15 06:57 

07/ 7/15 06:59 

2015-07-07 07:00:46.047 

07/ 7/15 07:03 

07/ 7/15 07:05 

07/ 7/15 07:07 

07/ 7/15 07:09 

07/ 7/15 07:11 

07/ 7/15 07:13 

2015-07-07 07:15:53.007 

2015-11-14 23:33:43.000 

2015-11-14 23:35:44.000 

2015-11-14 23:37:43.000 

2015-11-14 23:39:43.000 

2015-11-14 23:41:43.000 

11/14/15 23:42 

2015-11-14 23:45:43.000 

11/14/15 23:46 

2015-11-14 23:49:43.000 

2015-11-14 23:51:44.000 

私は平日、週末を利用するには日付を解析するつもりですし、余分として多分私は(1ではなく、通常の日付の365に番号を使用している)彼らに Julian date formatをオンにします。私がしようとした

:私は、パーサーまでCSV

  • 日を読んでいながら、日付を解析

    • 。例えばdateutil.parser.parse(x)は

    • Datetime.strptime

  • それらのどれも働きました。私はまだ日付を解析できません。 これらのデータは10個のファイルで構成されています。

    pd.read_csv(......, parse_dates('date'))と読むと、いくつかのファイルでは'object'、他のファイルでは'datetime64'という形式の日付列が読み込まれます。しかし、形式のファイル'datetime64'日付のでは解析できない、それがエラーを与えた場合でも:

    "Unknown String Format".

    任意のアイデアは役立つだろう!

    +0

    すべての日付は、句読点の文字がハイフンではなく、日、月、年を表す文字列の長さが異なる場合がありますか? –

    +0

    または、日付の見かけの順序を目安として頼ることができますか? –

    +0

    @BillBell – dss

    答えて

    0

    は、あなたはおそらく、私がテストを大量に行っていないいくつかのアプローチでこれをのmungeしているつもりが、私は使用してDateTimeオブジェクトにあなたの異なる日付の2(07/ 7/15 06:512015-11-14 23:45:43.000)を変換することができた:

    datetime.datetime.fromtimestamp(dateutil.parser.parse(date).timestamp()) 
    

    parser.parseメソッド内のdateパラメータは、日付の可変文字列形式になります。

    これを行うより良い方法があるかもしれませんが、結果を見るには、このアプローチを日付カラムのラムダメソッドとして使用してみてください。

    df_date = df['date'].apply(lambda d: datetime.datetime.fromtimestamp(dateutil.parser.parse(d).timestamp()) 
    
    +0

    であり、それは機能していませんAttributeError:typeオブジェクト 'datetime.datetime'には属性がありません ' datetime '@SeanParsons – dss

    +0

    コードに入力ミスがありました。もう一度やり直してください。' dateutil'モジュールと 'datetime'モジュールをインポートし、私の答えにあるコードブロックを試してみてください。 –

    +0

    最後に括弧がありません。これは問題ではない、それは同じ問題があります: "型オブジェクト 'datetime.datetime'は属性 'datetime'を持っていません" – dss

    0

    あなたのデータはさまざまな形式であるようです。だから、いくつかのパッケージが正しいフォーマットを推測できることを期待するのではなく、あなたが期待するさまざまなフォーマットのそれぞれを使って、tryの構文解析を行い、動作するフォーマットを取ることができます。

    1

    提示された形式が唯一の2つの形式であると仮定すると、次のようなことが行われます。文字列としてデータを読み込んでから解析します。

    import pandas as pd 
    
    df = pd.DataFrame({'date': ['07/7/15 06:51', '07/7/15 06:59', '2015-07-07 07:00:46.047', 
              '11/14/15 23:42', '2015-11-14 23:45:43.000']}) 
    
    # mask the df based on the date formats 
    dash_mask = df['date'].str.contains('-') 
    slash_mask = df['date'].str.contains('/') 
    
    # use the masks to apply pd.to_datetime() to only one format at a time 
    df.loc[dash_mask, 'datetime'] = pd.to_datetime(df.loc[dash_mask, 'date'], 
                   infer_datetime_format=True) 
    df.loc[slash_mask, 'datetime'] = pd.to_datetime(df.loc[slash_mask, 'date'], 
                   infer_datetime_format=True) 
    
    >>> df['datetime'].dt.date 
    0 2015-07-07 
    1 2015-07-07 
    2 2015-07-07 
    3 2015-11-14 
    4 2015-11-14 
    

    もちろん、これは機能に変わる可能性があり、同様のアプローチでより多くの日付形式に対応できますが、これで作業は完了します。私はそれがかなりではないことを許可します...

    ところで、日付だけではなく、その日の時間ではなく、日付の解析に問題を引き起こしている場合は、その部分を取り除くことができます。

    df['only_date'] = df['date'].str.split(' ').str[0] 
    >>> df 
             date only_date 
    0   07/7/15 06:51  07/7/15 
    1   07/7/15 06:59  07/7/15 
    2 2015-07-07 07:00:46.047 2015-07-07 
    3   11/14/15 23:42 11/14/15 
    4 2015-11-14 23:45:43.000 2015-11-14 
    
    +0

    あなたのコードは私のデータの半分を処理するために助けてくれてありがとう!私が言いたいのは、私が言及したように、いくつかのファイルの日付の列を 'datetime64'形式と他のものを 'オブジェクト'形式として読み込むということです。あなたのコードはdatetime64フォーマットで動作しています。オブジェクト形式の他のものにはエラーがあります:Unknown String Format – dss

    +0

    Hmmm、文字列でも動作するはずです。 'error = 'coerce''オプションを' pd.to_datetime() '関数に追加してみてください。認識できない形式の不正な文字列が存在する必要があります。次に、作成した 'datetime'列がない行を確認し、対応できる別の形式があるかどうかを調べることができます。 – 3novak

    関連する問題