【问题标题】:list of dates into datetime日期时间列表
【发布时间】:2021-10-01 11:33:08
【问题描述】:

我得到了一个日期列表,如下所示:

date_list = ['1. Okt 2021', '2. Okt 2021', '3. Okt 2021', '4. Okt 2021', '5. Okt 2021', '6. Okt 2021', '24. Sep 2021', '25. Sep 2021', '26. Sep 2021']

我想转换成日期时间

dates = [datetime.strptime(x,"%d %b %Y") for x in date_list]

输出是:

Traceback (most recent call last):
  File "c:/Users/Benutzt/Desktop/web_scraping/main.py", line 27, in <module>
    dates = [datetime.strptime(x,"%d %M %Y") for x in date_list]
  File "c:/Users/Benutzt/Desktop/web_scraping/main.py", line 27, in <listcomp>
    dates = [datetime.strptime(x,"%d %M %Y") for x in date_list]
  File "C:\Users\Benutzt\anaconda3\lib\_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "C:\Users\Benutzt\anaconda3\lib\_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '1. Okt 2021' does not match format '%d %b %Y'

【问题讨论】:

  • Okt 是几月份?是英文吗?
  • 德国的十月
  • 另外,没有 9 月 31 日和 32 日,请澄清一下?
  • 这只是一个例子,因为数据要大得多。我的错误我重写它。
  • 为什么要标记pandas?这些值在数据框中?

标签: python list datetime


【解决方案1】:

对于特定语言的月份(或日期)名称,您可以设置locale,例如德语

import locale
locale.setlocale(locale.LC_TIME, 'de_de') # locale (2nd parameter) is platform-specific !

对于有效日期输入的列表,这给出了示例

from datetime import datetime
date_list = ['1. Okt 2021', '2. Okt 2021', '3. Okt 2021', '4. Okt 2021', '5. Okt 2021', '6. Okt 2021', '30. Sep 2021']
dates = [datetime.strptime(x, "%d. %b %Y") for x in date_list]

print(dates)
[datetime.datetime(2021, 10, 1, 0, 0), datetime.datetime(2021, 10, 2, 0, 0), datetime.datetime(2021, 10, 3, 0, 0), datetime.datetime(2021, 10, 4, 0, 0), datetime.datetime(2021, 10, 5, 0, 0), datetime.datetime(2021, 10, 6, 0, 0), datetime.datetime(2021, 9, 30, 0, 0)]

旁注:语言环境设置也可以在 pandas 中使用:

import pandas as pd
df = pd.DataFrame({'dates': date_list})
df['dates'] = pd.to_datetime(df['dates'], format="%d. %b %Y")

df['dates']
0   2021-10-01
1   2021-10-02
2   2021-10-03
3   2021-10-04
4   2021-10-05
5   2021-10-06
6   2021-09-30
Name: dates, dtype: datetime64[ns]

【讨论】:

  • TypeError: strptime() 参数 1 必须是 str,而不是 float
  • @mika 无法复制。该示例对我来说很好...请检查变量“date_list”的状态或在干净的命名空间中运行我的示例以了解其工作原理。
  • 是的,我明白了,谢谢!我可以上传 .csv 文件吗?我从哪里得到数据
  • 解决方案是导入语言环境,非常感谢!!!
【解决方案2】:

你可以使用dateparser包:

# Python env: pip install dateparser
# Anaconda env: conda install dateparser
from dateparser import parse

df = pd.DataFrame({'Date': ['1. Okt 2021', '2. Okt 2021', '3. Okt 2021',
                            '4. Okt 2021', '5. Okt 2021', '6. Okt 2021',
                            '24. Sep 2021', '25. Sep 2021', '26. Sep 2021']})

df['Date'] = df['Date'].apply(parse, languages=['de'])
print(df)

# Output:
0   2021-10-01
1   2021-10-02
2   2021-10-03
3   2021-10-04
4   2021-10-05
5   2021-10-06
6   2021-09-24
7   2021-09-25
8   2021-09-26
Name: Date, dtype: datetime64[ns]

对于列表:

date_list = ['1. Okt 2021', '2. Okt 2021', '3. Okt 2021',
             '4. Okt 2021', '5. Okt 2021', '6. Okt 2021',
             '24. Sep 2021', '25. Sep 2021', '26. Sep 2021']

dates = [parse(d, languages=['de']) for d in date_list]
print(dates)

# Output:
[datetime.datetime(2021, 10, 1, 0, 0),
 datetime.datetime(2021, 10, 2, 0, 0),
 datetime.datetime(2021, 10, 3, 0, 0),
 datetime.datetime(2021, 10, 4, 0, 0),
 datetime.datetime(2021, 10, 5, 0, 0),
 datetime.datetime(2021, 10, 6, 0, 0),
 datetime.datetime(2021, 9, 24, 0, 0),
 datetime.datetime(2021, 9, 25, 0, 0),
 datetime.datetime(2021, 9, 26, 0, 0)]

【讨论】:

  • @mika。即使您已经为您选择了正确的答案,您能否查看我的解决方案。 dateparser 是一个非常有用的模块。
  • convenient... 把它交给了 %timeit,它的运行速度比指定格式的 pd.to_datetime 慢 25 倍左右,所以我猜是为了提高效率。
【解决方案3】:

您的日期的第一部分似乎是一个 ID,例如列表中项目的顺序。如果是这样,您需要在转换日期之前将其删除。此外,Okt%b 格式不匹配。您需要将其转换为 Oct

dates = [datetime.strptime(x.split(".")[-1].strip(), "%b %Y") for x in date_list]

【讨论】:

  • 那只是忽略了一天,不是吗?
  • @MrFuppes,如果您查看问题的编辑,您会看到原始示例包含以下两个日期字符串:31. Sep 202132. Sep 2021。由于这些日期无效,我假设字符串的第一部分不是日期,但实际上来自某种类型的列表。也许他们是从另一个文档中复制的,其中可能包含 88. Dec 2021245. Oct 2022 之类的条目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 2021-12-29
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多