如何将熊猫时间戳更改为 python 日期时间对象?

Posted

技术标签:

【中文标题】如何将熊猫时间戳更改为 python 日期时间对象?【英文标题】:How to change pandas timestamps to python datetime objects? 【发布时间】:2019-09-19 22:33:03 【问题描述】:

我正在寻找一种将 pandas 时间戳更改为 python 日期时间对象的方法,但我失败了。我用过 to_pydatetime()。

下面是我的 cmets 代码:

import pandas
import datetime
import pytz

forced_UTC = pytz.timezone("Europe/London").localize(datetime.datetime(2019, 1, 30, 9, 5)).tzinfo
forced_BST = pytz.timezone("Europe/London").localize(datetime.datetime(2019, 4, 27, 9, 5)).tzinfo
#print (forced_UTC, forced_BST)

# Create dataframe and check the value of the first element in the column.
my_df = pandas.DataFrame("my_column": ["2019-04-01 00:15:00", "2019-02-23 13:00:00", "2019-02-23 14:00:00"])
first_date = my_df["my_column"].iloc[0]
print (first_date, type(first_date)) # 2019-04-01 00:15:00 <class 'str'>

# Change every element in the column from string to datetime object.
my_df["my_column"] = [datetime.datetime.strptime(element, "%Y-%m-%d %H:%M:%S").replace(tzinfo=forced_UTC) for element in my_df["my_column"]]
first_date = my_df["my_column"].iloc[0]
print (first_date, type(first_date)) # <class 'pandas._libs.tslibs.timestamps.Timestamp'>
# Didn't work, thought it would make them python datetime objects.

# Try creating a new list and replacing the column.
list_to_replace = [element.to_pydatetime() for element in my_df["my_column"]] # make all timestamps datetimes
print (list_to_replace[0],type(list_to_replace[0])) # 2019-04-01 01:15:00+01:00 <class 'datetime.datetime'>
my_df["my_column"] = [element for element in list_to_replace]
first_date = my_df["my_column"].iloc[0] 
print (first_date, type(first_date))# 2019-04-01 01:15:00+01:00 <class pandas._libs.tslibs.timestamps.Timestamp'>
# Didn't work.

# Use to_pydatetime() doesn't work either
print (first_date.to_pydatetime(), type(first_date)) # 2019-04-01 01:15:00+01:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'>

# Using to_pydatetime() like this works!?!?!?!
first_date = my_df["my_column"].iloc[0].to_pydatetime()
print (first_date, type(first_date)) # 2019-04-01 01:15:00+01:00 <class 'datetime.datetime'>

# print (datetime.datetime.strftime(first_date, "%H"))
# print (datetime.datetime(2019, 4, 1, 0, 15, tzinfo=forced_BST) > first_date)

谁能看出我做错了什么?

【问题讨论】:

我发现 cmets 很难跟上。我想他们说当你打电话给to_pydatetime() 时,你会得到你想要的,所以我不清楚你在问什么。 当我为 1 个元素执行此操作时它可以工作,但是当我为所有元素调用该函数并尝试替换数据框的列时它会失败。 【参考方案1】:

它可以工作,但是您在没有修改类型的情况下打印了type。 在这里,您确实在打印熊猫日期 (first_date) 和熊猫类型 (type(first_date))。

first_date = my_df["my_column"].iloc[0] 
print (first_date, type(first_date)) # 2019-04-01 01:15:00+01:00 <class pandas._libs.tslibs.timestamps.Timestamp'>
# Didn't work.

在这种情况下,您正在打印一个 python 日期 (first_date.to_pydatetime()),因为您确实在使用 to_pydatetime,但是 first_date 变量从未被修改过,所以它的 type 仍然是一个熊猫日期。

print (first_date.to_pydatetime(), type(first_date)) # 2019-04-01 01:15:00+01:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'>

在这里,您还使用 python 日期 (first_date = first_date.to_pydatetime()) 覆盖 first_date 变量,这就是您认为它仅在那时才起作用的原因。所以现在first_date 将是一个python 日期,type(first_date) 将因此返回你所期望的

# Using to_pydatetime() like this works!?!?!?!
first_date = my_df["my_column"].iloc[0].to_pydatetime()
print (first_date, type(first_date)) # 2019-04-01 01:15:00+01:00 <class 'datetime.datetime'>

【讨论】:

嘿,我得到了你的第二和第三条评论,但我没有得到关于修改类型的第一条评论。你能进一步解释一下吗? list_to_replace 只有 python 日期时间对象。所以我将它们放入列中应该可以正常工作吗? @Lev 已编辑,我希望它现在可以澄清它。你确实在正确的道路上

以上是关于如何将熊猫时间戳更改为 python 日期时间对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 DDMMMYYYY HH:mm:ss:ssssss 格式的时间戳更改为 spark sql 中的 yyyy-MM-dd 格式 [重复]

将熊猫数据框中的多列更改为日期时间

将索引转换为日期时间对象后,MatplotLib 无法正确绘制熊猫时间序列 1 分钟数据

将频率“MS”设置为熊猫日期时间对象 - python

如何使用熊猫更改数据框中的日期时间格式? [复制]

使用python将对象列转换为日期类型列