我正在尝试将包含时间信息(UTC)的数据框列合并到包含datetime对象/字符串的单个列中。我的df的列如下所示:

YY MM DD HH
98 12 05 11
98 12 05 10


因此,我想要一个包含该时间信息的列。

到目前为止,我已经尝试过:

我已经合并为一个字符串,以便可以通过以下方式将它们解析为datetime对象

from dateutil.parser import parse
d_test = (list(df[0].map(str) + " " + df[1].map(str) + " " + df[2].map(str)
+ " " + df[3].map(str)))


现在我只需要解析日期字符串列表

parse_d = []
for d in d_test:
    parse_d.append(parse(d))


但是,这给我带来了“未知字符串错误”。我调查了一下,结果到了,因为一些日期如下:

d_test[5] = '98 12 5 0'


我试过阅读dateutil(https://labix.org/python-dateutil)的详细文档,据了解,我必须制作一个字典,将时区指定为键(在我的情况下为UTC),这可能会解决错误。

tzinfo ={}
parse(d_test[5], tzinfo=tzinfo)


也许,我缺少一些非常基本的东西,但是我不明白如何创建此字典。

最佳答案

通常,如果您知道字符串的格式,则无需使用dateutil.parser.parse进行解析,因为可以将datetime.strptime与指定的字符串一起使用。

在这种情况下,唯一有点不幸的是您有两位数的年份,其中有些年份是2000年之前的。在这种情况下,我可能会这样做:

cent_21_mask =  df['YY'] < 50
df.loc[:, 'YY'] = df.loc[:, 'YY'] + 1900
df.loc[cent_21_mask, 'YY'] = df.loc[cent_21_mask, 'YY'] + 100


完成此操作后,您可以使用this question(特别是this one)中的一种解决方案,将各个datetime列转换为pandas Timestamps / datetimes。

如果它们是UTC,则可以将pandas.Series.tz_localize'UTC'一起使用,以获取时区感知的日期时间。

放在一起:

import pandas as pd

df = pd.DataFrame(
    [[98, 12, 5, 11],
     [98, 12, 5, 10],
     [4, 12, 5, 00]],
     columns=['YY', 'MM', 'DD', 'HH'])

# Convert 2-digit years to 4-digit years
cent_21_mask =  df['YY'] < 50
df.loc[:, 'YY'] = df.loc[:, 'YY'] + 1900
df.loc[cent_21_mask, 'YY'] = df.loc[cent_21_mask, 'YY'] + 100


# Retrieve the date columns and rename them
col_renames = {'YY': 'year', 'MM': 'month', 'DD': 'day', 'HH': 'hour'}
dt_subset = df.loc[:, list(col_renames.keys())].rename(columns=col_renames)
dt_series = pd.to_datetime(dt_subset)

# Convert to UTC
dt_series = dt_series.dt.tz_localize('UTC')

# Result:
# 0   1998-12-05 11:00:00+00:00
# 1   1998-12-05 10:00:00+00:00
# 2   2004-12-05 00:00:00+00:00
# dtype: datetime64[ns, UTC]


另外,还要澄清此语句的两件事:


  我试过阅读dateutil(https://labix.org/python-dateutil)的详细文档,据了解,我必须制作一个字典,将时区指定为键(在我的情况下为UTC),这可能会解决错误。



现在,python-dateutil的正确文档是https://dateutil.readthedocs.io
如果您使用的是parse,则在您的情况下,没有理由将UTC添加到字典中并将其传递给tzinfos。如果您知道您的日期时间将是天真的,但它们表示的时间是UTC,请按常规解析它们以获取天真的日期时间,然后使用datetime.replace(dateutil.tz.tzutc())来获取日期时间。 tzinfos词典适用于时区信息实际在字符串中表示的时间。


当您具有表示UTC且不包含时区信息的字符串时的操作示例:

from dateutil.parser import parse
from dateutil import tz

dt = parse('1998-12-05 11:00')
dt = dt.replace(tzinfo=tz.tzutc())

关于python - 如何使用dateutil解析0小时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47574551/

10-12 18:14