【问题标题】:Datetime error in combining date and time dataframe objects组合日期和时间数据框对象时的日期时间错误
【发布时间】:2020-05-04 17:31:04
【问题描述】:

当我想将两个数据列合并到一个 DateTime 对象中时,我遇到了 Python 问题。初始日期列是字符串格式,小时是整数 (1, 2, 3, ....,23, 24),新的一天又从 1 开始(不是 24)。 我使用命令smartmeter_data['Datetime']=pd.to_datetime(smartmeter_data['Date']) + smartmeter_data['Time'].astype('timedelta64[h]') 添加一个新列,其中包含:日期和时间。 但是,我收到了非常奇怪的结果:

...
19  01/09/2019 2019-01-09 20:00:00
20  01/09/2019 2019-01-09 21:00:00
21  01/09/2019 2019-01-09 22:00:00
22  01/09/2019 2019-01-09 23:00:00
23  01/09/2019 2019-01-10 00:00:00
24  02/09/2019 2019-02-09 01:00:00
25  02/09/2019 2019-02-09 02:00:00
26  02/09/2019 2019-02-09 03:00:00
...

日期01/09/2019 更改为日期时间对象2019-01-10 00:00:00,这是错误的,并且在我的图表上产生了非常奇怪的“跳跃”。我想要的输出是:

...
19  01/09/2019 2019-01-09 20:00:00
20  01/09/2019 2019-01-09 21:00:00
21  01/09/2019 2019-01-09 22:00:00
22  01/09/2019 2019-01-09 23:00:00
23  01/09/2019 2019-02-09 00:00:00
24  02/09/2019 2019-02-09 01:00:00
25  02/09/2019 2019-02-09 02:00:00
26  02/09/2019 2019-02-09 03:00:00
...

我试图通过谷歌找到解决方案,但没有成功。有谁知道如何解决这个问题?

如果您能提供帮助,我将非常感激,使用日期和时间是我工作的基础。

【问题讨论】:

  • 您确定您的初始“日期”列已正确解析吗?默认情况下,pandas.to_datetime() 期望月份在字符串中排在第一位。这不是很明显,但您可以在 the docs 中找到它。明确一点,使用pd.to_datetime(smartmeter_data['Date'], format='%d/%m/%Y') ;-)
  • 请添加原始样本以及所需的输出
  • 嗨!第一列是 str,它不是 datetime 对象。如果我只将日期(第一列)转换为日期时间对象,那么我将收到正确的日期。我猜原因可能是这个小时数问题:由于新的一天从 1 开始,而不是从 24 开始,pyhton 将其理解为新的一天,小时 00:00:00 然后自动更改日期,但由于某种原因会更改一个月,而不是一天,它给出的图表非常错误。
  • 我需要一个包含日期和时间的列。首先,我尝试将日期和时间分别转换为 datetime 对象以在转换后合并它们,但我收到了太多不同的错误。我花了几个小时在上面。我在这段时间遇到的最大问题。

标签: python pandas dataframe datetime


【解决方案1】:

一天有 24 小时,因此如果您将 24 小时的时间增量添加到日期,则日期将更改为第二天。但是,为什么不直接减去 1 来获得正确的时间增量(0-23 而不是 1-24)?例如

import pandas as pd

smartmeter_data = pd.DataFrame({'Date': ['01/09/2019', '01/09/2019', '01/09/2019',
                                         '01/09/2019', '01/09/2019', '02/09/2019',
                                         '02/09/2019', '02/09/2019'],
                                'Time': [20, 21, 22, 23, 24, 1, 2, 3]})

smartmeter_data['Datetime'] = (pd.to_datetime(smartmeter_data['Date'], format='%d/%m/%Y') +
                               (smartmeter_data['Time'] - 1).astype('timedelta64[h]'))

# smartmeter_data
#          Date  Time            Datetime
# 0  01/09/2019    20 2019-09-01 19:00:00
# 1  01/09/2019    21 2019-09-01 20:00:00
# 2  01/09/2019    22 2019-09-01 21:00:00
# 3  01/09/2019    23 2019-09-01 22:00:00
# 4  01/09/2019    24 2019-09-01 23:00:00
# 5  02/09/2019     1 2019-09-02 00:00:00
# 6  02/09/2019     2 2019-09-02 01:00:00
# 7  02/09/2019     3 2019-09-02 02:00:00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多