使用可怕的日期时间数据处理数据集

时间:2016-12-29 12:44:39

标签: python datetime pandas numpy julian-date

我有一个巨大的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' date' s的文件无法解析,也会出错:

  

"未知字符串格式"。

任何想法都会有所帮助!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

问题似乎是您的数据有各种不同的格式。因此,不要希望某个包可以推断出正确的格式,您可以try使用您期望的每种不同格式进行解析,并选择有效的格式。

答案 2 :(得分:0)

您可能需要通过几种方法来解决这个问题我还没有完成大量的测试,但我能够转换两个不同的日期(07/ 7/15 06:512015-11-14 23:45:43.000)使用以下日期时间对象:

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

date方法中的parser.parse参数将是日期的各种字符串格式。

可能有更好的方法可以做到这一点,但尝试在date列上使用此方法作为lambda方法来查看结果。

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