如何将字符串日期范围更改为开始和结束日期?

Posted

技术标签:

【中文标题】如何将字符串日期范围更改为开始和结束日期?【英文标题】:How to change string date range to start and end date? 【发布时间】:2019-12-11 08:25:17 【问题描述】:

我正在尝试将字符串日期范围(例如 7 月 1 日至 30 日)分隔为作为日期时间的开始日期和结束日期(例如 2019 年 7 月 1 日和 2019 年 7 月 30 日)。如何转换?

我尝试过将字符串分解成碎片,但我相信使用正则表达式的唯一方法。

列中的字符串示例:

    "1 to 30 of July"
    "10 to 12 of August"
    "20 of January to 10 of February"

我用过^(\d1,2)\s([a-z]2)\s(\d1,2)\s([a-z]2)\s(\w1,13),但我错过了 M 的 D 到 M 的 D。

都是2019年的

【问题讨论】:

他们总是D of M吗? 你用正则表达式尝试过什么吗?你能发布你的努力吗? 我试过 ^\d1,2\s[az]2\s\d1,2\s[az]2\s\w 1,13 但我无法将它们分组... 可能还有另一个字符串,例如20th of January to 10th of February ? 不,'th' 已被删除 【参考方案1】:

我们可以使用带有Series.str.extractall 的正则表达式从您的数据中提取数字和月份。然后我们最终将字符串连接在一起:

days = df['Date'].str.extractall('(\d+)').unstack()

months = '('+'|'.join(['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'])+')'
monthnames = df['Date'].str.extractall(months).unstack().ffill(axis=1)

df = days + ' ' + monthnames.ffill(axis=1)
df.columns=['date_start', 'date_end']

输出

   date_start     date_end
0      1 July      30 July
1   10 August    12 August
2  20 January  10 February

如果您希望它们采用不带月份名称的日期格式:

df.apply(lambda x: pd.to_datetime(x, format='%d %B').dt.strftime('%m-%d'))

  date_start date_end
0      07-01    07-30
1      08-10    08-12
2      01-20    02-10

【讨论】:

【参考方案2】:

以下将提取日期和月份:

# update your month list properly
months = ['January', 'February', 'July', 'August']

# pattern
pattern = f'(\d+) (?:of (m))?\s?to (\d+).*(m)'

# extract:
s.str.extract(patterns)

输出:

    0        1   2         3
0   1      NaN  30      July
1  10      NaN  12    August
2  20  January  10  February

【讨论】:

以上是关于如何将字符串日期范围更改为开始和结束日期?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery UI 日期选择器 - 通过单击另一个按钮更改范围

MySQL - 将日期字符串更改为日期类型?

无法使用应用程序脚本格式化日期如何将字符串更改为日期

将字符串更改为日期的问题

Bigquery 中的错误日期格式从字符串更改为日期

如何将字符串时间戳更改为人类可读的日期格式? [复制]