【问题标题】:Date time conversion to pandas datetime64[updated]日期时间转换为 pandas datetime64 [更新]
【发布时间】:2021-07-23 04:10:32
【问题描述】:

我有一系列 40 年的数据,格式为 stn;yyyymmddhh:rainfall。我想将数据转换为 datetime64 格式。当我使用以下代码将其转换为日期时间时,我得到以下格式 pandas._libs.tslibs.timestamps.Timestamp 但是,我需要它采用 pandas 日期时间格式。基本上,我想将例如 numpy.int64 的 1981010100 转换为 datetime64

import pandas as pd
df = pd.read_csv('data.txt', delimiter = ";")
df['yyyy'] = df['yyyymmddhh'].astype(str).str[:4]
df = pd.to_datetime(data.yyyy, format='%Y-%m-%d')

Stn;yyyymmddhh;rainfall 
xyz;1981010100;0.0
xyz;1981010101;0.0
xyz;1981010102;0.0
xyz;1981010103;0.0
xyz;1981010104;0.0
xyz;1981010105;0.0
xyz;1981010106;0.0
xyz;1981010107;0.0
xyz;1981010108;0.0
xyz;1981010109;0.4
xyz;1981010110;0.6
xyz;1981010111;0.1
xyz;1981010112;0.1
xyz;1981010113;0.0
xyz;1981010114;0.1
xyz;1981010115;0.6
xyz;1981010116;0.0
xyz;1981010117;0.0
xyz;1981010118;0.2
xyz;1981010119;0.0
xyz;1981010120;0.0
xyz;1981010121;0.0
xyz;1981010122;0.0
xyz;1981010123;0.0
xyz;1981010200;0.0

【问题讨论】:

  • 请提供预期的minimal, reproducible example (MRE)。我们应该能够复制和粘贴您的代码的连续块,执行该文件,并重现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的输出来测试我们的建议。请include a minimal data frame 作为您的 MRE 的一部分。
  • 请找到添加的示例
  • 请遵循链接的发布指南。
  • 嗨,Dawar,您也可以查看我的解决方案。您不需要额外的.dt.strftime 来将日期格式化为您想要的格式。默认的 datetime64 显示格式已经是您想要的格式。如果您不想修改现有列yyyymmddhh,您可以使用另一列来保存它。我的解决方案应该更简单,并满足您的要求。
  • 非常感谢!是的,它确实有效

标签: python pandas timestamp datetime-format numpy-ndarray


【解决方案1】:

pd.to_datetime()可以和format=参数一起使用,如下:

df['yyyymmddhh'] = pd.to_datetime(df['yyyymmddhh'], format='%Y%m%d%H')

输出:

print(df)

    Stn          yyyymmddhh  rainfall 
0   xyz 1981-01-01 00:00:00        0.0
1   xyz 1981-01-01 01:00:00        0.0
2   xyz 1981-01-01 02:00:00        0.0
3   xyz 1981-01-01 03:00:00        0.0
4   xyz 1981-01-01 04:00:00        0.0
5   xyz 1981-01-01 05:00:00        0.0
6   xyz 1981-01-01 06:00:00        0.0
7   xyz 1981-01-01 07:00:00        0.0
8   xyz 1981-01-01 08:00:00        0.0
9   xyz 1981-01-01 09:00:00        0.4
10  xyz 1981-01-01 10:00:00        0.6
11  xyz 1981-01-01 11:00:00        0.1
12  xyz 1981-01-01 12:00:00        0.1
13  xyz 1981-01-01 13:00:00        0.0
14  xyz 1981-01-01 14:00:00        0.1
15  xyz 1981-01-01 15:00:00        0.6
16  xyz 1981-01-01 16:00:00        0.0
17  xyz 1981-01-01 17:00:00        0.0
18  xyz 1981-01-01 18:00:00        0.2
19  xyz 1981-01-01 19:00:00        0.0
20  xyz 1981-01-01 20:00:00        0.0
21  xyz 1981-01-01 21:00:00        0.0
22  xyz 1981-01-01 22:00:00        0.0
23  xyz 1981-01-01 23:00:00        0.0
24  xyz 1981-01-02 00:00:00        0.0

【讨论】:

  • 我刚刚意识到,使用这种方法,yyyymmddhh 列是时间戳格式,但我真正需要的是熊猫日期时间格式。如何将时间戳转换为日期时间
  • @Dawar 你在哪里看到时间戳格式的?您可以使用df.info() 来检查数据类型,并参考Dtype 列,您会看到它的dtype 是datetime64[ns]。还有用于转换pd.to_datetime()的函数,您可以参考文档并查看Returns部分,用于输入系列:返回类型为:Series of datetime64 dtype。仅当您将标量传递给此函数时,此函数才会返回时间戳,即单个元素而不是系列。
  • 感谢您的澄清。我用 type(df.yyyymmddhh[0]) 检查了它
  • @Dawar 不用担心!日期列仍为 datetime64 格式。只是 type() 函数会将元素类型视为时间戳。您可以使用带有 df1.yyyymmddhh.dtype 的 Pandas 属性进一步检查,并将 dtype 视为 dtype('<M8[ns]'),这是 datetime64 的特殊格式。您可以参考this answer了解更多信息。
【解决方案2】:

我相信这应该适合你。

import pandas as pd
df = pd.read_csv('data.txt', delimiter = ";")

df['date'] = pd.to_datetime(df['yyyymmddhh'], format='%Y%m%d%H')
df['formatted'] = pd.to_datetime(df['date'].dt.strftime('%Y-%m-%d %H:%M:%S'))

【讨论】:

  • 非常感谢!感兴趣的特定列是“yyyymmddhh”。我收到以下错误,KeyError: 'Stn;yyyymmddhh;rainfall'
  • 我的错!我错过了分隔符。现在将更改我的答案以反映这一点。
  • 别担心,我感觉到了
猜你喜欢
  • 2021-05-22
  • 2016-01-27
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 2022-12-21
相关资源
最近更新 更多