处理具有可怕日期时间数据的数据集
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 而不是常规日期)。
我曾尝试过:
在读取 csv 时解析日期
解析器截止日期;例如dateutil.parser.parse(x)
Datetime.strptime
但其中 none 有效。我仍然无法解析日期。
这些数据在 10 个部分 excel 文件中。
当我用 pd.read_csv(......, parse_dates('date'))
读取它们时,它在某些文件中将日期列读取为 'object'
,在其他文件中读取为 'datetime64'
格式。但即使格式为 'datetime64'
日期的文件也无法解析并且会给出错误:
"Unknown String Format".
任何想法都会有所帮助!
问题似乎是您的数据采用多种不同的格式。因此,与其希望某些包可以推断出正确的格式,不如 try
使用您期望的每种不同格式进行解析,然后选择有效的格式。
你可能不得不用几种方法来解决这个问题我没有做大量的测试,但我能够转换你的两个不同的日期(07/ 7/15 06:51
,2015-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
我有大量 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
但其中 none 有效。我仍然无法解析日期。 这些数据在 10 个部分 excel 文件中。
当我用 pd.read_csv(......, parse_dates('date'))
读取它们时,它在某些文件中将日期列读取为 'object'
,在其他文件中读取为 'datetime64'
格式。但即使格式为 'datetime64'
日期的文件也无法解析并且会给出错误:
"Unknown String Format".
任何想法都会有所帮助!
问题似乎是您的数据采用多种不同的格式。因此,与其希望某些包可以推断出正确的格式,不如 try
使用您期望的每种不同格式进行解析,然后选择有效的格式。
你可能不得不用几种方法来解决这个问题我没有做大量的测试,但我能够转换你的两个不同的日期(07/ 7/15 06:51
,2015-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