我正在处理一些整理得不好的数据,这些数据记录第1行(Y,M,D)中的日期,而接下来的N行则按值(ID,value1,value2)进行整理
例如:
column1 column2 column3
2018 10 2
ID01 a 1
ID02 b 4
ID03 c 2
2018 10 3
ID01 d 7
ID02 e 6
ID03 f 1
我想将日期行中的日期解析为datetime格式(2018-10-2),而是将其移动到新列中。
我希望它看起来像什么
column1 column2 column3 date
ID01 a 1 2018-10-2
ID02 b 4 2018-10-2
ID03 c 2 2018-10-2
ID01 d 7 2018-10-3
ID02 e 6 2018-10-3
ID03 f 1 2018-10-3
我尝试的一种方法是从文件末尾开始工作,检测日期行(通过检查第1列是否包含年份),然后将该行的数据帧拆分为以解析的日期时间命名的新文件格式。然后,在该文件中,我可以读取文件名(已解析)并仅使用此数据创建一个新列。然后,我将所有文件合并在一起,成为一个内聚的数据集。
我遇到的问题是我无法弄清楚如何告诉熊猫既向后工作又仅在特定行分开。我的一个想法是将最后一个日期的索引号写到一个变量中,并将该行号的数据框拆分到一个新文件中,但是我不知道如何从底部进行迭代。此外,我知道这种方法非常凌乱,并且我相信有一种更有效的方法可以实现这一目标。
我所能识别的日期列和解析日期:
years = [2015,2016,2017,2018]
df['year?'] = df['column1'].isin(years).astype(int) # Detect date row
if df['year?'] == 1: # I receive errors here
# Parse dates here
datedf = (df['column1'].astype(str))+(df['column2'].astype(str))+(df['column3'].astype(str))
df['date'] = pd.to_datetime(datedf, format='%Y%m%d') # Write date to 'date' column
答案 0 :(得分:1)
尝试一下:
df = pd.DataFrame([[2018,10,2],['ID01','a',1],['ID02','b',4],['ID03','c',2],[2018,10,3],['ID01','d',7],['ID02','e',6],['ID03','f',1]])
data = []
for index, row in df.iterrows():
if isinstance(row[0], int):
dt = pd.to_datetime('{}-{}-{}'.format(row[0],row[1],row[2]))
else:
data.append([row[0],row[1],row[2],dt])
df = pd.DataFrame(data)
输出
0 1 2 3
0 ID01 a 1 2018-10-02
1 ID02 b 4 2018-10-02
2 ID03 c 2 2018-10-02
3 ID01 d 7 2018-10-03
4 ID02 e 6 2018-10-03
5 ID03 f 1 2018-10-03
答案 1 :(得分:1)
我们可以通过几个步骤解决此问题:
forwardfill
df2 = df[df['column1'].str.match('(\d{4})')]
df2['date'] = pd.to_datetime(df2['column1'].astype(str) + df2['column2'].astype(str) + df2['column3'].astype(str), format='%Y%m%d')
df_final = pd.concat([df[~df['column1'].str.match('(\d{4})')], df2]).sort_index().ffill()
df_final = df_final[~df_final['column1'].str.match('(\d{4})')]
column1 column2 column3 date
1 ID01 a 1 2018-10-02
2 ID02 b 4 2018-10-02
3 ID03 c 2 2018-10-02
5 ID01 d 7 2018-10-03
6 ID02 e 6 2018-10-03
7 ID03 f 1 2018-10-03
注意
我使用column1
,column2
和column3
作为列名