我有一个巨大的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的文件无法解析,也会出错:
"未知字符串格式"。
任何想法都会有所帮助!
答案 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:51
,2015-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())