Pandas 索引日期时间切换月份和日期

Posted

技术标签:

【中文标题】Pandas 索引日期时间切换月份和日期【英文标题】:Panda Index Datetime Switching Months and Days 【发布时间】:2018-01-24 05:05:12 【问题描述】:

我有一个格式如下的熊猫 df.index。

这是一个日/月/年的字符串,所以第一项是 05Sep2017 等:

    05/09/17 #05Sep2017 07/09/17 #07Sep2017 ... 18/10/17 #18Oct2017

申请

df.index = pd.to_datetime(df.index) 

到上面,将其转换为:

    2017-05-09 #09May2017 2017-07-09 #09Jul2017 ... 2017-10-18 #18Oct2017

似乎正在发生的事情是第一个条目正在切换日和月。相反,最后一个条目(天大于 12)被正确转换。

我尝试通过将索引转换为列并应用来切换月份:

df['date'] = df.index
df['date'].apply(lambda x: dt.datetime.strftime(x, '%Y-%d-%m')) 

还有:

df['date'].apply(lambda x: dt.datetime.strftime(x, '%Y-%m-%d')) 

但无济于事。 如何将索引转换为日期时间,所有条目都是日/月/年?

【问题讨论】:

添加 dayfirst = True 【参考方案1】:

在 pandas 中默认格式为 dates YY-MM-DD

df = df.set_index('date_col')
df.index = pd.to_datetime(df.index)
print (df)
            val
2017-05-09    4
2017-07-09    8
2017-10-18    2

print (df.index)
DatetimeIndex(['2017-05-09', '2017-07-09', '2017-10-18'], dtype='datetime64[ns]', freq=None)

您需要strftime,但丢失了日期时间,因为获取字符串:

df.index = pd.to_datetime(df.index).strftime('%Y-%d-%m')
print (df.index)
Index(['2017-09-05', '2017-09-07', '2017-18-10'], dtype='object')

df.index = pd.to_datetime(df.index).strftime('%d-%b-%Y')
print (df)
             val
09-May-2017    4
09-Jul-2017    8
18-Oct-2017    2

【讨论】:

以上产生:'Index'对象没有属性'strftime'。 可能需要先df = df.set_index('date_col') 最后一行是可选的,所以使用df.index = pd.to_datetime(df.index).strftime('%Y-%d-%m') OR df.index = pd.to_datetime(df.index).strftime('%d-%b-%Y') 如果我的回答对您有帮助,请不要忘记 accept 它 - 单击答案旁边的复选标记 () 将其从灰色切换为已填充。谢谢。跨度> 耶斯瑞尔,再次感谢。我被困在最后一行:“ValueError:month must be i in 1..12”。然后看到我们可以添加参数 df.index = pd.to_datetime(df.index, dayfirst = True) 并且转换工作正常。

以上是关于Pandas 索引日期时间切换月份和日期的主要内容,如果未能解决你的问题,请参考以下文章

使用 Grouper 的 pandas 系列日期时间索引中的月份名称

如何按月份和年份输入过滤具有日期时间索引的数据框?熊猫

仅在 Pandas 中将日期时间转换为月份和年份 [重复]

Python Pandas 数据框:对于一年中的每个月,如果月份不存在,则将当月最后一天的日期添加到索引中,或者删除重复项

将 Pandas 系列日期时间“月份”数字转换为月份文本 [重复]

Pandas - 根据日期将数据框拆分为多个数据框?