【问题标题】:Pandas: datetime conversion from dtype objectPandas:从 dtype 对象转换日期时间
【发布时间】:2018-09-30 07:49:00
【问题描述】:

我正在研究如下所示的时间序列数据集:

         DateTime         SomeVariable 
0   01/01 01:00:00          0.24244
1   01/01 02:00:00          0.84141
2   01/01 03:00:00          0.14144
3   01/01 04:00:00          0.74443
4   01/01 05:00:00          0.99999

日期没有年份。最初,DateTime 的 dtype 是对象,我正在尝试将其更改为 pandas 日期时间格式。由于我的数据中的日期没有年份,因此使用:

df['DateTime'] = pd.to_datetime(df.DateTime)

我收到错误OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 1-01-01 01:00:00

我明白为什么我会收到错误(因为它不符合 pandas 可接受的格式),但我想知道如何将 dtype 从 object 更改为 pandas datetime 格式,而我的日期中没有年份。我将不胜感激。

编辑 1:

从那以后,我知道如果数据中没有年份,我就无法做到这一点。所以这就是我试图改变dtype的方式:

df = pd.read_csv(some file location)
df['DateTime'] = pd.to_datetime('2018/'+df['DateTime'], format='%y%d/%m %H:%M:%S')
df.head()

这样做,我得到:

ValueError: time data '2018/ 01/01 01:00:00' doesn't match format specified.

编辑 2:

将格式更改为'%Y/%m/%d %H:%M:%S'。 我的数据是每小时数据,所以一直到 24 小时。我只提供了演示数据,直到 5 小时。 我得到了将年份添加到 DateTime 的空间。为了删除它,这就是我所做的:

df['DateTime'] = pd.to_datetime('2018/'+df['DateTime'][1:], format='%Y/%m/%d %H:%M:%S')

我收到以下错误:

ValueError: time data '2018/ 01/01  02:00:00' doesn't match format specified

使用相同的代码将格式更改为'%y/%m/%d %H:%M:%S',这是我得到的错误:

ValueError: time data '2018/ 01/01  02:00:00' does not match format '%y/%m/%d %H:%M:%S' (match)

问题是因为年后的差距,但我无法摆脱它。

编辑 3:

添加年份后我可以摆脱空间,但是我仍然无法更改 dtype。

df['DateTime'] = pd.to_datetime('2018/'+df['DateTime'].str.strip(), format='%Y/%m/%d %H:%M:%S')

ValueError: time data '2018/01/01  01:00:00' doesn't match format specified

我注意到错误中的日期和时间之间有 2 个空格,但是在格式中添加 2 个空格并没有帮助。

编辑 4(解决方案)

删除了所有的多个空格。格式仍然不匹配。问题是因为时间格式。我的数据中的时间是 1-24,熊猫支持 0-23。只需将时间 24:00:00 更改为 00:00:00,现在就可以完美运行了。

【问题讨论】:

  • 或将格式更改为'%y %d/%m %H:%M:%S'
  • 我已经尝试过将格式更改为 '%y %d/%m %H:%M:%S' 的第二个建议。它导致 ValueError: time data '2018/ 01/01 01:00:00' does not match format '%y %d/%m %H:%M:%S' (match)
  • 您也没有正确使用大小写。请再次检查我的答案。例如,%Y%y 的含义不同。
  • 只要df['DateTime'] = pd.to_datetime('2018/'+df['DateTime'].str.strip(), format='%Y/%m/%d %H:%M:%S')
  • 你到了那里就有点讨厌! :D .str.replace(r'\s+', ' ') 将用一个空格替换多个空格。

标签: python pandas datetime time-series


【解决方案1】:

这是不可能的。 datetime 对象必须有一年。

可以做的是确保所有年份都与您的数据保持一致。

例如,在将年份设置为 2018 时转换为 datetime

df = pd.DataFrame({'DateTime': ['01/01 01:00:00', '01/01 02:00:00', '01/01 03:00:00',
                                '01/01 04:00:00', '01/01 05:00:00']})

df['DateTime'] = pd.to_datetime('2018/'+df['DateTime'], format='%Y/%m/%d %H:%M:%S')

print(df)

             DateTime
0 2018-01-01 01:00:00
1 2018-01-01 02:00:00
2 2018-01-01 03:00:00
3 2018-01-01 04:00:00
4 2018-01-01 05:00:00

【讨论】:

  • 对我来说,年份正在增加,但我收到 ValueError: time data '2018/ 01/01 01:00:00' doesn't match format specified。
  • 不,只是像你一样将年份添加到数据框中。我将按照我的方式更新问题中的代码。
【解决方案2】:
# Remove spaces. Have in mind this will remove all spaces.
df['DateTime'] = df['DateTime'].str.replace(" ", "")

# I'm assuming year does not matter and that 01/01 is in the format day/month.
df['DateTime'] = pd.to_datetime(df['DateTime'], format='%d/%m%H:%M:%S')

【讨论】:

  • 在执行此操作时,我收到以下错误:ValueError: time data '01/01 01:00:00' does not match format '%d/%m %H:%M:%S '(匹配)
  • @NOOB 我编辑了答案以在字符串问题的中间容纳您不需要的空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 2017-09-29
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
相关资源
最近更新 更多