在Python中拆分包含日期的数组

3

我有一个包含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数组不同时,我只想拆分日期并获取两个新数组,这两个新数组在所有索引中都具有与初始数组相同的形状。


2
其中一行没有空格,导致你的分割失败了。 - AKX
这个问题可以修复吗? - Ανδρέας Ψευτογκάς
2
取决于您对格式不正确的数据想要做什么。如果可以放弃这些行,那当然可以。 - AKX
我希望如果可能的话可以保留它们。 - Ανδρέας Ψευτογκάς
另外,您可以在循环中放置print(i)语句,以查看代码失败的值。 - PApostol
4个回答

2

只要你拥有所需的数据质量,你的方法是正确的。以下是一个可行的示例解决方案:将数据分割成“月份”和“小时”两个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')

1
也许你可以尝试这样做,以避免出现错误的日期:
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)

1
#You can use try catch to avoid the error    
time=np.array(parameters[:,2])
time1=time.astype(str)
month=[]
hour=[]
for i in (time1):
    try:
        month.append(i.split(' ')[0])
        hour.append(i.split(' ')[1])
    except:
        month.append('')
        hour.append('')
        continue
month1=np.array(month)
hour1=np.array(hour)

0

你需要决定如何处理不良数据条目:在解析代码周围添加“Try”和“Except”块。

当你到达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)

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