在datetime、Timestamp和datetime64之间转换

461

如何将 numpy.datetime64 对象转换为 datetime.datetime (或 Timestamp)?

在以下代码中,我创建一个datetime,timestamp和datetime64对象。

import datetime
import numpy as np
import pandas as pd
dt = datetime.datetime(2012, 5, 1)
# A strange way to extract a Timestamp object, there's surely a better way?
ts = pd.DatetimeIndex([dt])[0]
dt64 = np.datetime64(dt)

In [7]: dt
Out[7]: datetime.datetime(2012, 5, 1, 0, 0)

In [8]: ts
Out[8]: <Timestamp: 2012-05-01 00:00:00>

In [9]: dt64
Out[9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')

注意:从时间戳中获取日期时间很容易:

In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)

但是我们如何从 numpy.datetime64 (dt64) 中提取 datetimeTimestamp?

.

更新:我的数据集中有一个有点棘手的例子(可能是激励性的例子),它似乎是:

dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')

应该是datetime.datetime(2002, 6, 28, 1, 0),而不是一个长整型数值(1025222400000000000L)!


3
你应该接受 @Wes McKinney 的答案,它更简短,并且应该适用于最近的 numpypandas 版本。 - jfs
@J.F.Sebastian 嗯,这是否意味着答案是“不要从np.datetime转换到datetime”...只需使用pd.Timestamp(因为它是datetime的子类),或者如果您真的必须使用pd.Timestamp(dt64).to_datetime()。我仍然有点不满意,但肯定Wes'对我的旧问题不太具体(因此更适合世界)!再次感谢您抽出时间来回答它。 :) - Andy Hayden
你的问题中提到了“或者Timestamp”,而Timestamp本身就是datetime(它的一个子类):) - jfs
7
如果您是在2017年或之后来到这个问题,可以查看我下面的答案,其中详细介绍了datetime、datetime64和Timestamps的教程:https://dev59.com/I2Yr5IYBdhLWcg3waJdT#46921593 - Ted Petrou
对于Numpy -> datetime,截至2020年,字符串转换是最优雅的选项。 - tejasvi88
14个回答

1
我这样做了。
import pandas as pd

# Custom function to convert Pandas Datetime to Timestamp
def toTimestamp(data):
    return data.timestamp()

# Read a csv file
df = pd.read_csv("friends.csv")

# Replace the "birthdate" column by:
# 1. Transform to datetime
# 2. Apply the custom function to the column just converted
df["birthdate"] = pd.to_datetime(df["birthdate"]).apply(toTimestamp)

0

我在将包含时间信息的pandas数据框中的“日期”列转换为numpy数组时,唯一的方法是按照以下方式进行操作:(数据框从CSV文件“csvIn.csv”中读取)

import pandas as pd
import numpy as np

df = pd.read_csv("csvIn.csv")
df["date"] = pd.to_datetime(df["date"])
timestamps = np.array([np.datetime64(value) for dummy, value in df["date"].items()])

0

有些解决方案对我很有效,但numpy将废弃一些参数。 对我来说更好的解决方案是将日期读取为pandas datetime,并从pandas对象中显式提取年、月和日。 以下代码适用于最常见的情况。

def format_dates(dates):
    dt = pd.to_datetime(dates)
    try: return [datetime.date(x.year, x.month, x.day) for x in dt]    
    except TypeError: return datetime.date(dt.year, dt.month, dt.day)

-2

确实,所有这些日期时间类型都可能很困难,而且可能存在问题(必须仔细跟踪时区信息)。以下是我所做的,尽管我承认至少其中一部分“不是按设计来的”。此外,根据需要可以使其更加紧凑。

从numpy.datetime64 dt_a开始:

dt_a

numpy.datetime64('2015-04-24T23:11:26.270000-0700')

dt_a1 = dt_a.tolist() # 返回一个UTC时间的datetime对象,但没有tzinfo信息 dt_a1
datetime.datetime(2015, 4, 25, 6, 11, 26, 270000)
# now, make your "aware" datetime:

dt_a2=datetime.datetime(*list(dt_a1.timetuple()[:6]) + [dt_a1.microsecond], tzinfo=pytz.timezone('UTC')),当然,必要时可以将其压缩成一行。

请参阅 https://docs.scipy.org/doc/numpy/reference/arrays.datetime.html#changes-with-numpy-1-11 以了解时区处理的更改。 - hpaulj
编辑 以符合正确的代码格式、引用格式和文本格式。此外,请遵守适当的大写、语法,并检查拼写错误,根据SO指南操作 - 参见:如何发布代码示例 - SherylHohman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接