有没有一种方法可以检查变量是否为小时:分钟时区格式?

时间:2019-06-30 19:10:03

标签: python pandas datetime

我需要帮助清洗数据框的一列,该列包含日期或时间(取决于行)。我想拉出日期,并在每个时间戳行的单独列中列出日期。如何使用序号,日期时间和条件语句来做到这一点?

我正在做一个网络抓取个人项目,以将潮汐图提取到熊猫数据框中。我设法成功地抓取了数据,但是结果数据帧有些混乱,我正在尝试清理它。我的问题是,数据框的第一列列出了当前日期,随后的行列出了该日期的一系列时间,分别对应于涨潮,退潮等。我想将日期从该列中拉出并创建一个一个新的,其中列出了每个时间戳,我想使用一个条件来检查该行是日期格式还是时间格式。 我知道我可以使用iterrows逐行浏览行,而且我很确定我应该以某种方式使用datetime.time.hour和datetime.time.minute,但是我不清楚如何使用。

此问题的一个简单版本是,如果您将数据框的单个列解析为交替显示时间和日期值的数组:

array1 = ['1 January', '12:00 AM', '2 January, '1:00AM', etc.] 

您如何删除日期并将其放在单独的列中? (或者在这种情况下为数组。)我应该补充一点,您将拥有另一个数组,该数组包含array1中具有日期的相应条目的时间值,而该日期没有时间条目的值:

array2 = ['12 PM', NaN, '1 PM', Nan, etc.]

为澄清起见,我使用BeautifulSoup解析和抓取HTML,因此我很确定所有值都是字符串。同样,实际的数据框在日期值之间不一定有相同的空间,即它们不会交替显示,所以我不能只删除所有其他值

3 个答案:

答案 0 :(得分:2)

我强烈建议使用dateparserstr转换为正确的datetime格式:

>>> import dateparser
>>> dateparser.parse('1 January')
datetime.datetime(2019, 1, 1, 0, 0)
>>> dateparser.parse('12:00 AM')
datetime.datetime(2019, 6, 30, 0, 0)
  

您如何删除日期并将其放在单独的列中?

我将使用标准列表循环:

dates = []
times = []
for v in array1:
    if any(w in v for w in ['January', 'February', 'March', 'April']):  # to be continued
        dates.append(v)
    elif any(w in v for w in ['AM', 'PM']):
        times.append(v)
    else:
        raise Exception("Undetected")

答案 1 :(得分:0)

您可以使用“时间”模块。

import time

#Basic time and date can be extracted using:  
date_time = time.asctime(time.localtime(time.time()))

之后,您可以通过删除空格来拆分它,然后选择要保留到另一个变量的列出的项目。

splitted = date_time.split(' ')    
time = splitted[<integer here>] #<< Since this is a list, you can select the items you want to assign to the variable.

之后,您可以在语句中进行比较。 确保打印已拆分的变量,以确保您从列表中选择了正确的项目。

答案 2 :(得分:0)

如果我正确理解了问题,则希望使用数据框中的现有列创建另一列,例如:

d = {'col1': ['1 January', '12:00 AM', '2 February', '1:00AM']}
df = pd.DataFrame(d)

# can use regex like
df['col2'] = df[ df['col1'].str.contains ("^\d:|^\d\d:", regex = True)]

OR

# if want the months like
df['col2'] = df[ df['col1'].str.contains ('Jan|Feb')]
df