将字符串转换为日期时间

Posted

技术标签:

【中文标题】将字符串转换为日期时间【英文标题】:Convert string to datetime 【发布时间】:2017-08-31 14:25:30 【问题描述】:

我有一个简单的问题 - 似乎以前被问过很多次(例如,参见 here、here 和 here)。尽管如此,我无法解决它。

我得到了一个从 csv 文件中读取的 pandas 数据框。它包含名称为 start-plan 的列,其字符串格式为 '05-04-2017'(2017 年 4 月 5 日)。据我了解,它是%d-%m-%Y 形式的欧洲日期时间。 这是我的工作:

df = pd.read_csv('activities.csv')

这是数据框头部的样子:

print(df.head())

       start-plan start-actual    end-plan  end-actual  user  late
0  12-01-2017   16-01-2017  11-02-2017  10-02-2017     1     0
1  11-05-2017   15-05-2017  10-06-2017  18-06-2017     2     1
2  20-08-2017   20-08-2017  19-09-2017  05-10-2017     3     1
3  10-12-2017   10-12-2017  09-01-2018  08-01-2018     1     0
4  25-04-2017   25-04-2017  25-05-2017  26-05-2017     4     0

我尝试像这样转换列:

pd.to_datetime(pd.Series('start-plan'), format='%d-%m-%y')

我收到一条错误消息,指出 time data 'start-plan' does not match format '%d-%M-%Y' (match)

我做错了什么?此外,我有几列格式相同,我想转换。有没有可能一次性全部转换?

【问题讨论】:

【参考方案1】:

您正在使用'start-plan' 制作pd.Series

试试:

pd.to_datetime(df['start-plan'], format='%d-%m-%y')

您也可以使用选项dayfirst=True

你可以像这样一口气搞定

cols = ['start-plan', 'start-actual', 'end-plan', 'end-actual']
df = df[cols].apply(
    pd.to_datetime, dayfirst=True
).join(df.drop(cols, 1))

print(df)

  start-plan start-actual   end-plan end-actual  user  late
0 2017-01-12   2017-01-16 2017-02-11 2017-02-10     1     0
1 2017-05-11   2017-05-15 2017-06-10 2017-06-18     2     1
2 2017-08-20   2017-08-20 2017-09-19 2017-10-05     3     1
3 2017-12-10   2017-12-10 2018-01-09 2018-01-08     1     0
4 2017-04-25   2017-04-25 2017-05-25 2017-05-26     4     0

【讨论】:

我也试过df['start-plan'] = pd.to_datetime(df['start-plan'])。两者似乎都有效!谢谢! @Rachel 那是因为pd.to_datetime 能够推断。如果它碰巧是模棱两可的,你最好是具体的。 @Rachel,即使我认为熊猫会推断但尝试 df.loc[1, 'start-plan'].day。它返回 5 作为天而不是 11。所以 piRsquared 的答案是要走的路 回报时间小家伙

以上是关于将字符串转换为日期时间的主要内容,如果未能解决你的问题,请参考以下文章

无法将字符串转换为日期和日期转换为字符串 Swift 5.2

将日期时间转换为字符串 PHP

将字符串日期时间转换为熊猫日期时间

Python将日期时间字符串转换为日期

将 JSON 日期字符串转换为 Python 日期时间

将日期字符串转换为正确的格式