处理具有可怕日期时间数据的数据集

handling data set with horrible date time data

我有大量 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 而不是常规日期)。

我曾尝试过:

但其中 none 有效。我仍然无法解析日期。 这些数据在 10 个部分 excel 文件中。

当我用 pd.read_csv(......, parse_dates('date')) 读取它们时,它在某些文件中将日期列读取为 'object',在其他文件中读取为 'datetime64' 格式。但即使格式为 'datetime64' 日期的文件也无法解析并且会给出错误:

"Unknown String Format".

任何想法都会有所帮助!

问题似乎是您的数据采用多种不同的格式。因此,与其希望某些包可以推断出正确的格式,不如 try 使用您期望的每种不同格式进行解析,然后选择有效的格式。

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

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())

如果我们假设所提供的格式是唯一使用的两种格式,则以下内容可能会起到作用。只需将数据作为字符串读入,然后我们将从那里进行解析。

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