2017-02-22 92 views
1

我解析的數據來自CSV文件。我得到了上述錯誤。我相信這個格式是正確的。Python ValueError:時間數據'日期'與格式'%Y /%m /%d%H:%M:%S.%f'

我的代碼:

import pandas as pd 
    from datetime import datetime 
    import csv 
    import matplotlib.pyplot as plt 
    import matplotlib.dates as mdates 
    headers = ['Sensor Value','Date','Time'] 
    df = pd.read_csv('C:/Users\Lala Rushan\Downloads\DataLog.CSV',names=headers) 
    print (df) 

    df['Date'] = df['Date'].map(lambda x: datetime.strptime(str(x), '%Y/%m/%d %H:%M:%S.%f')) 
    x = df['Date'] 
    y = df['Sensor Value'] 

    # plot 
    plt.plot(x,y) 
    # beautify the x-labels 
    plt.gcf().autofmt_xdate() 

    plt.show() 

我的數據框:

0 Sensor Value   Date   Time 
1    2 2017/02/17 19:06:17.188 
2    72 2017/02/17 19:06:22.360 
3    72 2017/02/17 19:06:27.348 

控制檯錯誤:

new_values = map_f(values, arg) 
    File "pandas\src\inference.pyx", line 1207, in pandas.lib.map_infer  (pandas\lib.c:66124) 
    File "C:/Users/Lala Rushan/PycharmProjects/newgraph/newgraph.py", line 10, in <lambda> 
    df['Date'] = df['Date'].map(lambda x: datetime.strptime(str(x), '%Y/%m/%d %H:%M:%S.%f')) 
    File "C:\Users\Lala Rushan\AppData\Local\Programs\Python\Python35\lib\_strptime.py", line 500, in _strptime_datetime 
    tt, fraction = _strptime(data_string, format) 
    File "C:\Users\Lala Rushan\AppData\Local\Programs\Python\Python35\lib\_strptime.py", line 337, in _strptime 
    (data_string, format)) 
ValueError: time data 'Date' does not match format '%Y/%m/%d %H:%M:%S.%f' 

CSV輸入:

Sensor Value Date Time 
2 2017/02/17 19:06:17.188 
72 2017/02/17 19:06:22.360 
72 2017/02/17 19:06:27.348 
72 2017/02/17 19:06:32.482 
74 2017/02/17 19:06:37.515 
70 2017/02/17 19:06:42.580 
+0

我敢肯定,你不需要做這種方式,嘗試'DF = PD。 read_csv('C:/ Users \ Lala Rushan \ Downloads \ DataLog.CSV',names = headers,parse_dates = ['Date'])' – EdChum

+0

CSV中是日期和時間分隔的列嗎?請顯示CSV輸入的一些行。 – MKesper

+0

我也試過這種方式,它給了我這個錯誤:** ValueError:時間數據'日期'不符合格式'%Y /%m /%d'**。 – rushan

回答

0

我認爲你需要to_datetime與解析問題的數值參數errors='coerce'NaN

df['Date'] = pd.to_datetime(df['Date'], errors='coerce') 

對於檢查問題的行:

print (df[pd.to_datetime(df['Date'], errors='coerce').isnull()]) 

但是,如果需要在read_csv閱讀列date和時間datetime使用參數parse_dates

import pandas as pd 
from pandas.compat import StringIO 

temp=u""" 
2,2017/02/17,19:06:17.188 
72,2017/02/17,19:06:22.360 
72,2017/02/17,19:06:27.348 
72,2017/02/17,19:06:32.482 
74,2017/02/17,19:06:37.515 
70,2017/02/17,19:06:42.580""" 
#after testing replace 'StringIO(temp)' to 'C:/Users\Lala Rushan\Downloads\DataLog.CSV' 
headers = ['Sensor Value','Date','Time'] 
df = pd.read_csv(StringIO(temp), names=headers, parse_dates={'Datetime':['Date','Time']}) 
print (df) 
       Datetime Sensor Value 
0 2017-02-17 19:06:17.188    2 
1 2017-02-17 19:06:22.360   72 
2 2017-02-17 19:06:27.348   72 
3 2017-02-17 19:06:32.482   72 
4 2017-02-17 19:06:37.515   74 
5 2017-02-17 19:06:42.580   70 

print (df.dtypes) 
Datetime  datetime64[ns] 
Sensor Value    int64 
dtype: object 

第一解決方案與第二,在最後一排的結合是30.2.2017不存在的東西:

temp=u""" 
2,2017/02/17,19:06:17.188 
72,2017/02/17,19:06:22.360 
72,2017/02/17,19:06:27.348 
72,2017/02/17,19:06:32.482 
74,2017/02/17,19:06:37.515 
70,2017/02/30,19:06:42.580""" 
#after testing replace 'StringIO(temp)' to 'C:/Users\Lala Rushan\Downloads\DataLog.CSV' 
headers = ['Sensor Value','Date','Time'] 
df = pd.read_csv(StringIO(temp), names=headers, parse_dates={'Datetime':['Date','Time']}) 
print (df) 
        Datetime Sensor Value 
0 2017/02/17 19:06:17.188    2 
1 2017/02/17 19:06:22.360   72 
2 2017/02/17 19:06:27.348   72 
3 2017/02/17 19:06:32.482   72 
4 2017/02/17 19:06:37.515   74 
5 2017/02/30 19:06:42.580   70 

df['Datetime'] = pd.to_datetime(df['Datetime'], errors='coerce') 
print (df) 
       Datetime Sensor Value 
0 2017-02-17 19:06:17.188    2 
1 2017-02-17 19:06:22.360   72 
2 2017-02-17 19:06:27.348   72 
3 2017-02-17 19:06:32.482   72 
4 2017-02-17 19:06:37.515   74 
5      NaT   70 <- replace 30.2.2017 to NaT (same as NaN for dates) 

print (df.dtypes) 
Datetime  datetime64[ns] 
Sensor Value    int64 
dtype: object 
0

取出names=headers部分,因爲這是令人困惑pandaspandas假定第一行是默認的標題行。通過指定標題名稱,它假定第一行必須是數據,所以你的錯誤是單詞日期不匹配你的格式(它沒有)

編輯:只需將read_csv行更改爲:

df = pd.read_csv('C:/Users\Lala Rushan\Downloads\DataLog.CSV') 

因此,您不必指定headers,因此您可以刪除該行。

EDIT2:

的問題是,你的日期和時間字段是deperate。創建一個名爲DateTime的新列,它將兩者結合起來,然後將您的striptime函數應用於該列。

替換我告訴你,刪除線,df['Date'] = df['Date'].map一個與此

df['DateTime'] = df['Date'] + " " + df['Time'] 
df['DateTime'] = df['DateTime'].map(lambda x: datetime.strptime(str(x), '%Y/%m/%d %H:%M:%S.%f')) 
+0

你能修改我的代碼嗎?我嘗試過,但仍然有相同的錯誤。 – rushan

+0

你好,我只是改變了你說的那一行,它仍然給我錯誤:** ValueError:時間數據'2017/02/17'與格式不匹配'%Y /%m /%d%H:%M :%S%F'**。 – rushan

+0

你好,現在我刪除了那一行,錯誤現在說:** ValueError:無法將字符串轉換爲float:'2017/02/17'**我真的被困在這最後兩天。這是真的在做我的頭。 – rushan

0

,而在一個大的csv文件分析日期我也有類似的問題。就我而言,我在csv中觸發了一些錯誤的行,所以我只是將它們從數據框中移除,以便稍後解析日期。

如果你不介意失去這個信息,你可以做這樣的事情:

df = df[df['Date'].str.contains(r'^\d{4}-\d{2}-\d{2} \d{2}\:\d{2}:\d{2}.\d{3}')] 

timer = lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S.%f')  

df['Date'] = df['Date'].apply(timer) 
相關問題