在熊猫中将格式不一致的字符串日期转换为日期时间

时间:2020-08-18 23:57:36

标签: python pandas datetime

我有一个pandas数据框,其中日期信息是带有月份和年份的字符串:

date = ["JUN 17", "JULY 17", "AUG 18", "NOV 19"]

请注意,月份通常写为3位数的缩写,但有时写为6月和7月的完整月份。

我想将其转换为日期时间格式,该格式假定每个日期都在月份的第一天:

date = [06-01-2017, 07-01-2017, 08-01-2018, 11-01-2019]

编辑以提供更多信息: 我不确定如何处理两个主要问题:

  1. 月份的格式不一致。尝试通过仅提取字符串的前三个字符的子集来解决此问题。
  2. 年份仅是最后两位数,试图指定年份为2020,而不会变得非常混乱 我已经尝试了十几种无法使用的东西,最近的尝试是:
df['date'] = pd.to_datetime(dict(year = df['Record Month'].astype(str).str[-2:], month = df['Record Month'].astype(str).str[0:3], day=1))

此错误为“无法解析位置0的字符串“ JUN”

2 个答案:

答案 0 :(得分:1)

如果您不确定会出现的许多拼写错误,则词典映射将不起作用。也许您最好的机会是分割和切片,以便将其标准化为年和月列,然后建立日期。

如果date是您的示例中的列表。

date = [d.split() for d in date]
df = pd.DataFrame([m[:3].lower, '20' + y] for m, y in date],
# df = pd.DataFrame([[s.split()[0][:3].lower, '20' + s.split()[1]] for s in date],
    columns=['month', 'year'])

然后将映射器传递给series.replace

df.month = df.month.replace({'jan': 1, 'feb': 2 ...})

然后从其组成部分解析日期

# first cap the date to the first day of the month
df['day'] = 1
df = pd.to_datetime(df)

答案 1 :(得分:0)

您已经接近使用pandas.to_datetime()。但是,除了使用字典以外,您还可以将日期字符串重新格式化为更标准的格式。如果将每个日期字符串转换为MMMYY格式(与您所做的工作非常相似),则可以将strftime format "%b%y"传递到to_datetime(),它将把字符串转换为日期。

import pandas as pd

date = ["JUN 17", "JULY 17", "AUG 18", "NOV 19"]
df = pd.DataFrame(date, columns=["Record Month"])

df['date'] = pd.to_datetime(df["Record Month"].str[:3] + df["Record Month"].str[-2:], format='%b%y')

print(df)

产生以下结果:

  Record Date       date
0      JUN 17 2017-06-01
1     JULY 17 2017-07-01
2      AUG 18 2018-08-01
3      NOV 19 2019-11-01