在python中拆分带有日期的数组

在python中拆分带有日期的数组,python,arrays,string,numpy,split,Python,Arrays,String,Numpy,Split,我有一个由1列和1980796行组成的数组,其中充满了日期。日期类型如下所示: '2018-01-01 00:00:00 +01:00' 我试图将日期分成两个不同的数组,一个按天,另一个按小时。下面是我正在处理的代码部分,用于提取这两个数组: time=np.array(parameters[:,2]) time1=time.astype(str) month=[] hour=[] for i in (time1): month.appe

我有一个由1列和1980796行组成的数组,其中充满了日期。日期类型如下所示: '2018-01-01 00:00:00 +01:00' 我试图将日期分成两个不同的数组,一个按天,另一个按小时。下面是我正在处理的代码部分,用于提取这两个数组:

    time=np.array(parameters[:,2])
    time1=time.astype(str)
    month=[]
    hour=[]
    for i in (time1):
         month.append(i.split(' ')[0])
         hour.append(i.split(' ')[1])
    month1=np.array(month)
    hour1=np.array(hour)
运行代码时,我收到以下错误:

Traceback (most recent call last):
  File "<ipython-input-136-3cf951a10e93>", line 12, in <module>
    hour.append(i.split(' ')[1])

IndexError: list index out of range

最后,当我勾选时,新数组的形状与time1数组不同。我只想拆分日期,并获得两个新数组,其形状与所有索引中的初始数组相同。

如果您具有所需的数据质量,则您的方法是正确的。下面是一个工作示例解决方案:将数据拆分为月数和小时数的numpy数组以测试数据质量,尝试打印出符合或不符合预期时间戳格式的所有日期:

from datetime import datetime, timedelta

import numpy as np


parameters = [datetime.today() - timedelta(days=x) for x in range(5)]

months, hours = [], []

for dt in parameters:
    month = str(dt).split(' ')[0].split('-')[1]
    hour = str(dt).split(' ')[1].split(':')[1]
    months.append(month)
    hours.append(hour)

months = np.array(months)
hours = np.array(hours)

print(f"{months = }")
print(f"{hours = }")
返回:

months = array(['06', '06', '06', '06', '06'], dtype='<U2')
hours = array(['14', '14', '14', '14', '14'], dtype='<U2')

如果您具有所需的数据质量,那么您的方法是正确的。下面是一个工作示例解决方案:将数据拆分为月数和小时数的numpy数组以测试数据质量,尝试打印出符合或不符合预期时间戳格式的所有日期:

from datetime import datetime, timedelta

import numpy as np


parameters = [datetime.today() - timedelta(days=x) for x in range(5)]

months, hours = [], []

for dt in parameters:
    month = str(dt).split(' ')[0].split('-')[1]
    hour = str(dt).split(' ')[1].split(':')[1]
    months.append(month)
    hours.append(hour)

months = np.array(months)
hours = np.array(hours)

print(f"{months = }")
print(f"{hours = }")
返回:

months = array(['06', '06', '06', '06', '06'], dtype='<U2')
hours = array(['14', '14', '14', '14', '14'], dtype='<U2')

您需要决定如何处理坏数据条目: 在解析代码周围添加Try-and-Except块

到达时,应打印出导致错误的原始字符串。 然后您应该忽略标记为坏的字符串,并继续for循环。 或者通过抛出错误来结束程序,并手动修复输入日期

一条注释:在将其添加到数组之前,应该解析所有内容,因为如果在小时发生错误,则不希望将其他值附加到月份。所以首先解析这两个值,并将它们放入一个变量中。只有当您知道它们都很好时,才能将它们附加到数组中

try:
  parsed_month=i.split(' ')[0]    
  parsed_hour=i.split(' ')[1]    
  month.append(parsed_month)
  hour.append(parsed_hour)
except: # catch *all* exceptions
  # print out the string
  # print out the error
  # maybe exit the program with an error (because the input)

您需要决定如何处理坏数据条目: 在解析代码周围添加Try-and-Except块

到达时,应打印出导致错误的原始字符串。 然后您应该忽略标记为坏的字符串,并继续for循环。 或者通过抛出错误来结束程序,并手动修复输入日期

一条注释:在将其添加到数组之前,应该解析所有内容,因为如果在小时发生错误,则不希望将其他值附加到月份。所以首先解析这两个值,并将它们放入一个变量中。只有当您知道它们都很好时,才能将它们附加到数组中

try:
  parsed_month=i.split(' ')[0]    
  parsed_hour=i.split(' ')[1]    
  month.append(parsed_month)
  hour.append(parsed_hour)
except: # catch *all* exceptions
  # print out the string
  # print out the error
  # maybe exit the program with an error (because the input)

也许你可以尝试这样的方法来避免糟糕的约会:

import numpy as np
dates = ['2018-01-01 00:00:00 +01:00', '2018-01-02 01:00:00 +01:00', '2018-01-0302:00:00 +01:00']

arr = np.array(dates).astype(str)
month, hour = [], []

for i in arr:
    if i.count(' ')==2:
      m, h, _ = i.split(' ')
      month.append(m)
      hour.append(h)
    else:
      print('Value "{0}" does not contain 2 spaces like the rest!'.format(i))

month = np.array(month)
hour = np.array(hour)

也许你可以尝试这样的方法来避免糟糕的约会:

import numpy as np
dates = ['2018-01-01 00:00:00 +01:00', '2018-01-02 01:00:00 +01:00', '2018-01-0302:00:00 +01:00']

arr = np.array(dates).astype(str)
month, hour = [], []

for i in arr:
    if i.count(' ')==2:
      m, h, _ = i.split(' ')
      month.append(m)
      hour.append(h)
    else:
      print('Value "{0}" does not contain 2 spaces like the rest!'.format(i))

month = np.array(month)
hour = np.array(hour)

其中一行没有空格,拆分失败。这是可以修复的吗?取决于您希望如何处理格式不正确的数据。如果可以删除这些行,当然可以。如果可能的话,我希望保留它们。此外,您可以在循环中放置一个printi语句,查看代码失败的值。其中一行没有空格,拆分失败。这是可以修复的吗?取决于您希望对格式不正确的数据执行什么操作。如果可以删除这些行,当然可以。如果可能的话,我想保留它们。此外,您可以在循环中放入printi语句,查看代码失败的值。