如何使用 dateutil 解析 0 小时
How to Parse 0 hour with dateutil
我正在尝试将包含时间信息 (UTC) 的数据框列合并到包含日期时间 object/string 的单个列中。我的 df 的列是这样的:
YY MM DD HH
98 12 05 11
98 12 05 10
所以,我想要一个包含该时间信息的列。
到目前为止我尝试过的:
我已经合并成一个字符串,这样我就可以通过
将它们解析成一个日期时间对象
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))
但这让我感到很兴奋 "unknown string error"。我调查了它,它出现了,因为有些日期是这样的:
d_test[5] = '98 12 5 0'
我已经尝试阅读 dateutil (https://labix.org/python-dateutil) 的详细文档,我的理解是我必须制作一个字典,将时区指定为键(在我的例子中是 UTC),这可能会解决错误。
tzinfo ={}
parse(d_test[5], tzinfo=tzinfo)
也许,我遗漏了一些非常基本的东西,但我无法理解如何创建这本词典。
如果你用这种格式解析日期怎么样?
parse("98/12/05 00h")
一般来说,如果你知道一个字符串的格式,你就不需要使用dateutil.parser.parse
来解析它,因为你可以使用[=14] =] 与指定的字符串。
在这种情况下,唯一有点不幸的是你有两位数的年份,其中一些是 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 (specifically this one) 中的解决方案之一将您的个人日期时间列转换为 pandas 时间戳/日期时间。
如果这些是 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]
此外,澄清关于此声明的两点:
I've tried reading the detailed documentation of dateutil (https://labix.org/python-dateutil) and what I understood is that I've to make a dictionary specifying the timezone as key (UTC in my case) and that might solve the error.
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())
我正在尝试将包含时间信息 (UTC) 的数据框列合并到包含日期时间 object/string 的单个列中。我的 df 的列是这样的:
YY MM DD HH
98 12 05 11
98 12 05 10
所以,我想要一个包含该时间信息的列。
到目前为止我尝试过的:
我已经合并成一个字符串,这样我就可以通过
将它们解析成一个日期时间对象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))
但这让我感到很兴奋 "unknown string error"。我调查了它,它出现了,因为有些日期是这样的:
d_test[5] = '98 12 5 0'
我已经尝试阅读 dateutil (https://labix.org/python-dateutil) 的详细文档,我的理解是我必须制作一个字典,将时区指定为键(在我的例子中是 UTC),这可能会解决错误。
tzinfo ={}
parse(d_test[5], tzinfo=tzinfo)
也许,我遗漏了一些非常基本的东西,但我无法理解如何创建这本词典。
如果你用这种格式解析日期怎么样?
parse("98/12/05 00h")
一般来说,如果你知道一个字符串的格式,你就不需要使用dateutil.parser.parse
来解析它,因为你可以使用[=14] =] 与指定的字符串。
在这种情况下,唯一有点不幸的是你有两位数的年份,其中一些是 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 (specifically this one) 中的解决方案之一将您的个人日期时间列转换为 pandas 时间戳/日期时间。
如果这些是 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]
此外,澄清关于此声明的两点:
I've tried reading the detailed documentation of dateutil (https://labix.org/python-dateutil) and what I understood is that I've to make a dictionary specifying the timezone as key (UTC in my case) and that might solve the error.
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())