字符串到日期时间转换 - 指定日期 - 月份日期的年份

时间:2016-10-22 01:56:33

标签: python r datetime dataframe

我是R用户,正在尝试学习Python。

我正在使用Python中的数据框,其日期列为dtype对象。

df['Date']
    0          1-Mar
    1          1-Mar
    2          1-Mar
    3          1-Mar
    4          1-Mar
    5          1-Mar

我尝试使用此功能将此对象转换为日期时间:

pd.to_datetime(df['Date'], format = "%d-%b")

我得到的结果如下:

0        1900-03-01
1        1900-03-01
2        1900-03-01
3        1900-03-01
4        1900-03-01
5        1900-03-01

对我来说有点奇怪,因为当我在R使用:

时这样做
as.Date(df$Date, format = "%d-%b")

我得到了我的期望:

[1] "2016-03-01" "2016-03-01" "2016-03-01" "2016-03-01"
[5] "2016-03-01" "2016-03-01"

出现两个问题:1)为什么R假设我想要当前年份,如果我不想要当年?

2)在Python中,使用Pandas - 如何指定我想要的年份以及时区?

感谢。

2 个答案:

答案 0 :(得分:2)

1)为什么R假设我想要当年,如果我不想要当年,该怎么办?

R假设是因为你有点要求它假设。问题是:当你为R提供1-Mar而没有一年时,返回的答案可能是系统特定的。最常见的行为是假设缺少的年,月或日是当前的。因此,一旦转换完成,您将获得当前年份。如果碰巧你不想要当年,你可以通过指定年份告诉R。

2)在Python中,使用Pandas - 如何指定我想要的年份以及时区?

同样,当你没有为他们提供有意义的字符串格式时,你真的不能指望Python或者R给你一些有意义的日期。通过给pandas一个缺少年份的日期字符串,您可以将其留给图书馆的开发人员来猜测今年应该是什么。在任何一种情况下,您都可以通过执行以下操作强制年份为2016

<强> 熊猫

df1 = pd.DataFrame(data = {'Date':['1-Mar']*6})
df1['Date'] = pd.to_datetime(df1['Date']+"-2016",format="%d-%b-%Y")

收率:

0   2016-03-01
1   2016-03-01
2   2016-03-01
3   2016-03-01
4   2016-03-01
5   2016-03-01

<强> - [R

df1 <- data.frame(Date = rep('1-Mar',6))
as.Date(paste(df1$Date,"2016",sep = "-"), format = "%d-%b-%Y")

收率:

"2016-03-01" "2016-03-01" "2016-03-01" "2016-03-01" "2016-03-01" "2016-03-01"

你可以把年份变成你喜欢的一年,但是你不能指望语言或图书馆为你提供你想要的结果。有时,设计语言或库有一点主观性。最重要的是:确保你没事,如果你的开始日期字符串不完整,仍然可以使用你给的任何东西。

我希望这会有所帮助。

答案 1 :(得分:0)

我无法帮助你(1)但是(2):

import pytz
pd.to_datetime(df['Date'], format = "%d-%b").replace(year=2016, tzinfo=pytz.utc)

在python中,如果你没有在datetime中指定一年,python将它设置为0而你得到1900,因为year的{​​{1}}分量是自1900年以来的年数) 。