我需要帮助清洗数据框的一列,该列包含日期或时间(取决于行)。我想拉出日期,并在每个时间戳行的单独列中列出日期。如何使用序号,日期时间和条件语句来做到这一点?
我正在做一个网络抓取个人项目,以将潮汐图提取到熊猫数据框中。我设法成功地抓取了数据,但是结果数据帧有些混乱,我正在尝试清理它。我的问题是,数据框的第一列列出了当前日期,随后的行列出了该日期的一系列时间,分别对应于涨潮,退潮等。我想将日期从该列中拉出并创建一个一个新的,其中列出了每个时间戳,我想使用一个条件来检查该行是日期格式还是时间格式。 我知道我可以使用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,因此我很确定所有值都是字符串。同样,实际的数据框在日期值之间不一定有相同的空间,即它们不会交替显示,所以我不能只删除所有其他值。
答案 0 :(得分:2)
我强烈建议使用dateparser
将str
转换为正确的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