2016-12-29 125 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 

我要解析日期使用平日,週末和作爲一個額外的,也許我會變成他們Julian date format(使用數字1到365,而不是常規的日期)。

我曾嘗試:

  • 解析日期,而我讀的CSV

  • 日期,直到解析器;例如dateutil.parser.parse(X)

  • Datetime.strptime

,但沒有一次成功。我仍然無法解析日期。 這些數據在10部分excel文件中。

當我使用pd.read_csv(......, parse_dates('date'))讀取它們時,它在某些文件中讀取日期列爲'object',在其他文件中讀取爲'datetime64'格式。但是,即使與格式'datetime64'日期的文件無法解析,並給出了一個錯誤:

"Unknown String Format".

任何想法,將有助於!

+0

是否所有的日期或者日 - 月 - 年或年 - 月 - 日,其中的標點字符可能不是一個連字符,代表天,月,年可能有所不同字符串的長度? –

+0

或者,我們可以依靠日期的明顯排序作爲指導嗎? –

+0

你的意思是'我們可以依靠...'嗎?「@BillBell – dss

回答

0

你可能將不得不用幾種方法來Munge時間這個我沒有做過測試的顯著量,但我用能的不同日期的2(07/ 7/15 06:512015-11-14 23:45:43.000)轉換成datetime對象:

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

parser.parse方法內的date參數將是你有日期的不同的字符串格式。

有可能是一個更好的方式來做到這一點,但嘗試使用日期列上這一方法作爲一個lambda方法看到的結果。

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

不工作它給了一個AttributeError:類型對象'datetime.datetime'沒有屬性' datetime'@SeanParsons – dss

+0

我在代碼中有一個輸入錯誤,請重試。導入'dateutil'模塊和'datetime'模塊,然後嘗試使用我的答案中的代碼塊。 –

+0

您最後錯過了括號,但是這不是問題,它仍然有同樣的問題:「類型對象'datetime.datetime'沒有屬性'datetime'」 – dss

0

這個問題似乎是你的數據有各種不同的格式。因此,而不是希望一些包可以推斷出正確的格式,你可以使用try每一個你所期望的不同格式的解析,並採取工程之一。

1

如果我們假設所提供的格式是唯一使用的兩種格式,則下面的方法可能會有效。只是作爲字符串讀取數據,然後我們將在那裏分析。

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格式。另一種是以對象形式出現錯誤:未知字符串格式 – dss

+0

嗯,這也應該在字符串上工作。嘗試在'pd.to_datetime()'函數中添加'error ='coerce''選項。必須有一些不具有任何可識別格式的錯誤字符串。然後,您可以查看哪些行缺少您創建的'datetime'列,以查看是否有可以容納的另一種格式。 – 3novak